标签:
要求,给定一个单链表,要求对改单链表实现反转,即最后一个结点变成头结点
单链表定义和建立:
1 typedef struct Node 2 { 3 int data; 4 Node * pNext; 5 }Node,*LinkList; 6 7 void CreateListHead(Node **L, int n) 8 { 9 Node* p; 10 int i; 11 12 *L = (Node*)malloc(sizeof(Node)); 13 (*L)->pNext = NULL; 14 15 for( i=0; i < n; i++ ) 16 { 17 p = (Node*)malloc(sizeof(Node)); // 生成新结点 18 p->data = n-i; 19 p->pNext = (*L)->pNext; 20 (*L)->pNext = p; 21 } 22 }
迭代实现思路:
1 Node* ReverseLink(Node **head) 2 { 3 Node *next; 4 Node *prev = NULL; 5 6 while((*head) != NULL) 7 { 8 next = (*head)->pNext; 9 (*head)->pNext = prev; 10 prev = (*head); 11 (*head) = next; 12 } 13 14 return prev; 15 }
递归实现:
整个递归中,newhead经过不断递归调用,最终指向到了最后一个结点,也就是我们需要返回的链表的新头结点,然后,head指针在递归完成后,要做回溯工作,即反转方向。因为外层利用了堆栈存下了前面的结点和指向,所以递归完成后,外层一定有一个指针还指着head,这也是递归可以比迭代少用一个变量的原因)
1 Node *ReverseLink2(Node **head) 2 { 3 Node *newHead; 4 5 if((*head)->pNext == NULL) 6 return (*head); 7 8 newHead = ReverseLink2(&(*head)->pNext); /*递归部分*/ 9 (*head)->pNext->pNext = (*head); /*回朔部分,把head的下个节点指向自己,head节点指为NULL*/ 10 (*head)->pNext = NULL; 11 12 return newHead; 13 }
标签:
原文地址:http://www.cnblogs.com/cber/p/4236475.html