逆转单向链表的意思是:给定你一个单向链表,一个整数n(n为要逆转的结点数),要求你把链表从头结点到第n个结点给逆转过来
图示:
给出一个单向链表,一个整数n=4。也就是要求把该链表从头结点(head->next)开始到第四个结点,把他们逆转过来。逆转后头结点由1变成了4,然后1来链接5
那么如何实现这样的逆转链表呢?既然要改变结点的序列,我们自然而然想到要用一些指针来指向保存这些结点。这里用到三个指针:New,Old,Tag
New指针:所指的就是完成逆转的链表的头结点
Old指针:所指的就是未完成逆转的链表的头结点
Tag指针;指向Old的下一个结点
一开始的时候可以先让New指向链表的头结点,让Old指向New的下一个结点
为什么要用Tag呢?(参照上图)当我们把2这个结点的next逆转向1后,2后的链表就找不回来了。所以Tag是用来保存逆转过程中Old后的结点,为了在Old逆转后,开始下一个结点的逆转时还能找回Old的下一个结点进行逆转
三个指针设定好后,接下来就可以开始逆转链表了。首先我们把2这个结点的next逆转过来指向1,然后把三个指针都依次向后移动一个结点。New指向了2结点,New所指的就是完成逆转的链表的头结点,Old指向3,Old指向了当前还没完成逆转的链表的头结点,Tag指向Old的下一个结点
接下来继续逆转,下一步就是把Old所指的未完成逆转的结点进行逆转,也就是把3->next指向2,然后三个指针New,Old,Tag依次往后移一位
当逆转的结点到了第4个结点后(到达给定的整数n),也就是应该停止不需要再往后逆转了。这时,我们看看还需要什么改动:1这个结点的指向还是指向2,1这个结点应该指向n+1这个结点,也就是逆转前的第n个结点(或者说逆转完后的头结点)的下一个结点,这个结点我们用Tag保存了起来。所以我们要做的下一步就是把1这个逆转完后的尾结点的next指向Tag,也就是4这个结点。然后链表的head结点此时也要做修改,不是指向1这个结点了,而是指向逆转完后的头结点(也就是New这个结点)
这样我们就完成了对单向链表的n个结点的逆转。
如下是代码实现:
List Reserve(List head,int n)
{int cnt=1;List New,Old,Tag;New=Head->next;Old=New->next;while(cnt<n){Tag=Old->next;Old->next=New;New=Old;Old=Tag;cnt++;}Head->next->next=Old;return New;
}
1.传进去的两个参数:链表的头结点head,整数n
定义三个指针New,Old,Tag
定义cnt做计数
2.开始让New指针指向头结点(head->next)
让Old指向New->next
3.然后开始做逆转
while循环在cnt<n(也就是还没逆转完)时进行
循环里:先让Tag指针指向Old->next(保存Old的下一个结点的位置)
然后做逆转,逆转一次cnt++
逆转完之后把New,Old指针向后移
4.当完成了n个结点的逆转后
跳出循环做最后两步
首先头结点head->next->next指向Old结点(也就是逆转前的头结点)
之后把头结点return出去赋给head就可以了