线性结构:单向链表的逆转

23 篇文章 0 订阅
2 篇文章 0 订阅

逆转单向链表的意思就是,给定你一个单向链表,和一个整数NN为要逆转的结点数,要求你把链表从头结点到第N个结点给逆转过来。

意思是这样的,如下图所示:

给出一个单向链表,和给定整数N=4,也就是要求把该链表从头结点(Head->Next)开始到第四个结点,把他们逆转过来,像下面逆转后头结点由1变成了4,然后1后来链接5

那么如何去实现这样的逆转链表?既然要改变结点的序列,我们自然而然想到要用一些指针来指向保存这些结点。这里把一个单向链表逆转另外用到三个指针。一个New,一个Old,和一个Tag

New指针用来指向已经逆转好的新的链表的头结点的位置,一开始的时候New可以先让它指向链表的头结点。第二个指针Old我们用来指向没有逆转完的,旧的链表的头结点,因为我们是把结点一个一个的逆转,所以Old明显是跟在New后面的,所以一开始可以让Old指向New的下一个结点。至于为什么还要第三个指针Tag,这是一个标记,我们看

当我们把2这个结点的Next逆转指向1后,2后的链表就找不回来了,因为你把2逆转后,就没有指针指向3了,这样3后面的链表就都丢掉了。所以第三个指针Tag是用来保存逆转过程中Old后的结点,为了在Old逆转后,开始下一个结点的逆转时还能找回Old的下一个结点进行逆转。

三个指针设定好后,接下来就可以开始逆转链表了,首先我们把2这个结点的Next逆转过来指向1,然后把三个指针都依次向后移动一个结点,New指向了2结点,New所指的就是完成逆转的链表的头结点,Old指向3Old指向了当前还没完成逆转的链表的头结点,Tag指向Old的下一个结点。

接下来继续逆转,下一步就是把Old所指的未完成逆转的结点进行逆转,也就是把3->Next指向2,然后三个指针NewOldTag依次往后移一位。


当逆转的结点到了第4个结点后(达到用户输入的整数N后),也就是要停止了不需要往后逆转了。这时我们看还要做什么改动,1这个结点的指向还是指向21这个结点应该指向第N+1个结点才对,也就是逆转前的第N个结点(逆转完后的头结点)的下一个结点,这个结点我们用Tag保存了起来,所以这里要做的下一步是把1这个逆转完后的尾结点的Next指向Tag,也就是4这个结点。然后链表的Head结点此时也要做修改,不是指向1这个结点了,而是指向逆转完后的头结点也就是New这个结点。


这样我们就完成了对单向链表的N个结点的逆转了。接下来我们看下代码如何实现:

传进去的两个参数一个是链表的头结点Head和一个整数N,然定义三个要用的指针NewOldTag指针,和一个cnt做计数,一开始cnt等于1。开始让New指针指向头结点也就是Head->NextOld指向New->Next,然后开始做逆转了。While循环里当cnt<N也就是还没逆转完时,循环里先让Tag指针指向Old->Next也就是保存Old的下一个结点的位置,然后第113Old->Next等于New也就是做逆转了,114115行就是逆转完一个后就把指针向后移。然后cnt++。当完成了N个结点的逆转后,就要做最后两步,首先头结点Head->Next->Next指向Old结点,也就是逆转前的头结点,逆转后变成尾结点了,指向下一个结点。最后还要把链表头指向逆转完后的头结点,之间把头结点return出去赋给Head就可以了。这样就完成了单向链表的逆转。


  • 33
    点赞
  • 114
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值