复习一下链表反转
分别用递归的方法和非递归的方法实现。
链表反转中通过借助辅助參数,能够用两个指针完毕反转 Node* Reverse2Point(List* head)
#include <stdio.h> #include <malloc.h> typedef int ElemType; typedef struct Node { int data; struct Node* next; }Node, *List; //用数组arr来初始化链表中数据;此例中链表无头点 int InitList(List *list, ElemType* arr, int num) { int i= 0; Node* tail_node; Node* tmp_node; *list =(List)malloc(sizeof(Node)); if(NULL == *list) return; (*list)->data = arr[i]; (*list)->next = NULL; tail_node = *list; for(i = 1; i < num; i++) { tmp_node = (Node*)malloc(sizeof(Node)); if(NULL == tmp_node) return; tmp_node->data = arr[i]; tmp_node->next = NULL; tail_node->next = tmp_node; tail_node = tmp_node; } } void TraveseList(List list) { Node* tmp_node; if(NULL == list) return; tmp_node = list; while(tmp_node) { printf("%d ", tmp_node->data); tmp_node = tmp_node->next; } printf(" "); } void ReverseList(List* list) { Node* p_pre = NULL; Node* p_cur = NULL; Node* p_nxt = NULL; if(NULL == list) return; p_cur = (*list)->next; p_pre = *list; p_pre->next = NULL; while(p_cur) { p_nxt = p_cur->next; p_cur->next = p_pre; p_pre = p_cur; p_cur = p_nxt; } *list = p_pre; } Node* Reverse2Point(List* head) { Node* p_cur = NULL; Node* p_nxt = NULL; if(NULL == *head) return; p_cur = (*head)->next; (*head)->next = NULL; while(p_cur) { p_nxt = p_cur->next; p_cur->next = *head; *head = p_cur; p_cur = p_nxt; } } //递归实现反转,返回反转后的链表头 //原理同上述非递归方法。反转当前节点和该节点的指针(反转前分别保存当前节点和该节点的下一个节点。以便完毕兴许节点同样的操作--通过递归完毕) Node* Reverse(Node* p_cur, Node* p_pre) { if(NULL == p_cur->next) { p_cur->next = p_pre; return p_cur; } else { Node *p_nxt = p_cur->next; p_cur->next = p_pre; Reverse(p_nxt, p_cur); } } int main() { List head; Node* tmp; int array[] = {3, 5, 7, 8, 2}; InitList(&head, array, 5); TraveseList(head); printf("reverse list:"); ReverseList(&head); TraveseList(head); printf("reverse list:"); head = Reverse(head, NULL); TraveseList(head); printf("reverse list:"); Reverse2Point(&head); TraveseList(head); return 0; }