网站开发内容,wordpress 目录扫描,东莞 网站建设,wordpress文章页特色逆转单向链表的意思是#xff1a;给定你一个单向链表#xff0c;一个整数n#xff08;n为要逆转的结点数#xff09;#xff0c;要求你把链表从头结点到第n个结点给逆转过来 图示#xff1a; 给出一个单向链表#xff0c;一个整数n4。也就是要求把该链表从头结点#x…逆转单向链表的意思是给定你一个单向链表一个整数nn为要逆转的结点数要求你把链表从头结点到第n个结点给逆转过来 图示 给出一个单向链表一个整数n4。也就是要求把该链表从头结点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指向3Old指向了当前还没完成逆转的链表的头结点Tag指向Old的下一个结点 接下来继续逆转下一步就是把Old所指的未完成逆转的结点进行逆转也就是把3-next指向2然后三个指针NewOldTag依次往后移一位 当逆转的结点到了第4个结点后到达给定的整数n也就是应该停止不需要再往后逆转了。这时我们看看还需要什么改动1这个结点的指向还是指向21这个结点应该指向n1这个结点也就是逆转前的第n个结点或者说逆转完后的头结点的下一个结点这个结点我们用Tag保存了起来。所以我们要做的下一步就是把1这个逆转完后的尾结点的next指向Tag也就是4这个结点。然后链表的head结点此时也要做修改不是指向1这个结点了而是指向逆转完后的头结点也就是New这个结点 这样我们就完成了对单向链表的n个结点的逆转。 如下是代码实现
List Reserve(List head,int n)
{int cnt1;List New,Old,Tag;NewHead-next;OldNew-next;while(cntn){TagOld-next;Old-nextNew;NewOld;OldTag;cnt;}Head-next-nextOld;return New;
}1.传进去的两个参数链表的头结点head整数n 定义三个指针NewOldTag 定义cnt做计数
2.开始让New指针指向头结点head-next 让Old指向New-next
3.然后开始做逆转 while循环在cntn也就是还没逆转完时进行 循环里先让Tag指针指向Old-next(保存Old的下一个结点的位置) 然后做逆转逆转一次cnt 逆转完之后把NewOld指针向后移
4.当完成了n个结点的逆转后 跳出循环做最后两步 首先头结点head-next-next指向Old结点也就是逆转前的头结点 之后把头结点return出去赋给head就可以了