码迷,mamicode.com
首页 > 其他好文 > 详细

单链表反转问题

时间:2015-01-20 17:28:15      阅读:161      评论:0      收藏:0      [点我收藏+]

标签:

要求,给定一个单链表,要求对改单链表实现反转,即最后一个结点变成头结点

单链表定义和建立:

 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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!