前提

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. struct Node {
  4. int data;
  5. struct Node* next;
  6. };
  7. typedef struct Node node;
  8. void printList(struct Node* n)
  9. {
  10. while(n != NULL) {
  11. printf(" %d ", n->data);
  12. n = n->next;
  13. }
  14. puts("");
  15. }
  16. void appendToArray(node** head_ref, int* a, int len)
  17. {
  18. if (len <= 0) {
  19. printf("the given len must be greater than or equal to 0");
  20. return ;
  21. }
  22. if (*head_ref != NULL) {
  23. printf("please input a linked list for empty");
  24. return ;
  25. }
  26. node* temp = (node*)malloc(sizeof(node));
  27. *head_ref = temp;
  28. temp->data = a[0];
  29. temp->next = NULL;
  30. for(int i=1; i<len; ++i) {
  31. node *new_node = (node*)malloc(sizeof(node));
  32. new_node->data = a[i];
  33. new_node->next = NULL;
  34. temp->next = new_node;
  35. temp = new_node;
  36. }
  37. }

单链表反转

  1. void reverselinkedlist(node** head_ref)
  2. {
  3. node* pre = null;
  4. node* current = *head_ref;
  5. node* next = current->next;
  6. while(current != null) {
  7. next = current->next;
  8. current->next = pre;
  9. pre = current;
  10. current = next;
  11. }
  12. *head_ref = pre;
  13. }
  14. int main()
  15. {
  16. node* head = NULL;
  17. int a[5] = {1, 2, 3, 4, 5};
  18. appendToArray(&head, a, 5);
  19. printList(head);
  20. reverseLinkedList(&head);
  21. printList(head);
  22. }

链表中环的检测

两个有序的链表合并

递归的写法更好

删除链表倒数第 n 个结点

111.删除链表倒数第 n 个结点.md

求链表的中间结点