http://www.cnblogs.com/ccdev/archive/2012/09/08/2676485.html
通过迭代(非递归)及递归将单链表逆序
老生常谈的问题了,不过很多地方面试还是很喜欢问这个问题。实际工程中感觉用处不大,需要逆序的存储为什么要选择单链表呢?为什么不用list(in c++)或iterator(in any language)?或者将数据全部推入栈中再依次弹出。说了这么多有点无聊了,参看酷壳的《我为什么反对纯算法面试》。
迭代(非递归)算法描述:
设置两个临时指针prev和next分别标记当前结点的前驱和后继,将当前结点的next指针指向前驱,然后把前驱指针替换为当前结点,当前结点替换为next,即向“后”移动,直到链表空了(next为NULL)。
C/C++实现:
1 typedef struct _Node
2 {
3 struct _Node* next;
4 int data;
5 } List;
6
7 List* reverse(List* head)
8 {
9 if(List == NULL)
10 return ;
11
12 List* pre = head;
13 List* cur = head->next;
14 List* ne;
15 while(cur != NULL)
16 {
17 ne = cur->next;
18 cur->next = pre;
19 pre = cur;
20 cur = next;
21 }
22 head->next = NULL;
23 head = pre;
24
25 return head;
26 }
递归算法描述:要将当前结点逆序,那么先将它的后继结点都逆序,然后把逆序后的尾结点的next指向当前结点即可。
C/C++实现:
1 List* recurReverse(List* p, List* head)
2 {
3 if(p == NULL || p->next == NULL)
4 {
5 head = p;
6 return p;
7 }
8 else
9 {
10 List* q = reverse(p->next, head);
11 q->next = p;
12 return p;
13 }
14 }
完。
iCC Develop Center