循环控制_例题链表反转非递归【学习笔记】

例一:链表反转

在这里插入图片描述

前言:

  • 如果链表有100万个元素,资源开销并不大,把它反转也不是见特别复杂的事,
  • 但是用“递归”就会调100万次,系统开销非常大,
  • 所以要用循环的方法做出链表的反转。

在这里插入图片描述

用循环的方法做“链表反转”的步骤:

①定义循环不变式

  • 说一句断言,让它在整个循环中始终成立

之前的“递归”做法:

  • 把第一个元素单独拿出来,把2345进行递归

“循环”做法:

  • 在中间切一刀:
    在这里插入图片描述
  • 前三个结点反转完:
    在这里插入图片描述
    3和4的连接线属于结点3的部分:
    切之前,3的next指向4
    切之后,3的next指向2

各放一个变量来维持3和4这两个结点:
在这里插入图片描述
newHead:新的链表头
在这里插入图片描述
【以上是循环不定式】
保证这句话从循环开始到循环结束,
在每次的循环体中,
都要成立。


用循环的方法做“链表反转”的步骤:
①定义循环不变式
②把newHead和currentHead向前推进1
在这里插入图片描述
newHead更新为结点4:4321是一个已经反转的链表
currentHead更新为结点5:5指向null没有反转


newHead和currentHead的初始值是?

当什么都没有动的时候,newHead和currentHead仍然要保持【循环不变式】
在这里插入图片描述
12345null:往右方向的链表。

  • newHead必须指向已经反转成功的链表的头(此时什么都没有反转,已经完成反转的链表是个空链表),newHead指向null;
  • currentHead必须指向还没有反转的链表的头(此时什么都没有反转),currentHead指向1;
    【如下】
    在这里插入图片描述
    【一步一步个向右推进】
    在这里插入图片描述
    一直推进到:
    newHead指向5,currentHead指向null;
    此时newHead就是我们要的结果,
    54321已经成功把链表进行反转。

用具体代码实现这个想法:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述


在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 在循环之前,假设newHead指向反转成功的链表;
  • 当循环体做完之后,保持newHead指向反转成功的链表;
  • 通过这4行代码,维持了【循环不变式】,并且把【循环不变式】向前推进了。

在循环体,正确工作

在这里插入图片描述


验证循环正确性:

curHead being last node|
next = null
curHead next reversed
newHead points to last node
curHead = null
下一轮循环:curHead != null,跳出循环


输出结果:

在这里插入图片描述


结论:

能写循环还是写循环,
虽然写起来可能会比递归难一点点。


完整代码在这里哦!

CheeseCheese-IScream
给个小星星鼓励一下吧~❤谢谢❤

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值