反转链表

[方法1]双指针迭代法

交换pre和cur的指向,使用cur遍历完所有的结点。

遍历结束时,cur=null,pre为反转链表的第一个结点。

 1  1 Lnode reverseList(Linklist &head){
 2  2     Lnode *pre,*cur,*tmp;
 3  3     pre = NULL;
 4  4     cur = head;
 5  5     while(cur){
 6  6         tmp = cur ->next;
 7  7         cur->next = pre;
 8  8         pre = cur;
 9  9         cur = tmp;
10 10     }
11 11     return pre;
12 12 }
双指针迭代(伪代码)

 

[方法2]递归解法

将第一个结点与其后的一串结点分为两部分,先把其后一串结点先反转好,再将反转好的一串结点与第一个节点进行反转。

递归出口:不能再反转->当前或下个节点为NULL

1 Lnode reverseList(Linklist &head)
2 {
3     Lnode *cur=NULL;
4     if(head==NULL || head->next==NULL) return head;
5     cur = reverseList(head->next);//子链反转,返回子链头结点
6     head->next->next = head;//反转
7     head->next = NULL;//第一个节点反转指向,指向NULL
8     return cur;
9 }
递归解法

 

posted @ 2020-08-20 22:52  Pig2pignb  阅读(140)  评论(0)    收藏  举报