学习笔记:https://www.bilibili.com/video/BV1B4411H76f?p=22&vd_source=43542de2d5004969a81ea4d3b5a28b2a
-
题目要求:反转 HeroNode 单链
-
解题思路:创建一个新的链表 ,把数据1插入到 新链表的 reverseHead 和 reverseHead.next 之间,并把head.next的指针指向数据2。
这样数据1就操作完了,数据2、数据3 以此类推。
- 步骤一:创建一个新的链表
- 步骤二:把数据1 插入到新链表
上图化简后:
- 步骤三:重复以上步骤
化简后:
- 代码如下:
//将单链表反转
public static void reversetList(HeroNode head) {
//如果当前链表为空,或者只有一个节点,无需反转,直接返回
if(head.next == null || head.next.next == null) {
return ;
}
//定义一个辅助的指针(变量),帮助我们遍历原来的链表
HeroNode cur = head.next;
HeroNode next = null;// 指向当前节点[cur]的下一个节点
HeroNode reverseHead = new HeroNode(0, "", "");
//遍历原来的链表,每遍历一个节点,就将其取出,并放在新的链表reverseHead 的最前端
//动脑筋
while(cur != null) {
next = cur.next;//先暂时保存当前节点的下一个节点,因为后面需要使用
cur.next = reverseHead.next;//将cur的下一个节点指向新的链表的最前端
reverseHead.next = cur; //将cur 连接到新的链表上
cur = next;//让cur后移
}
//将head.next 指向 reverseHead.next , 实现单链表的反转
head.next = reverseHead.next;
}
- 图解代码:
- 定义变量 cur 、next
HeroNode cur = head.next;
next = cur.next;
reverseHead.next = cur;
在head.next指向数据1的时候
此时cur == 数据1
此时next == cur.next,即 head.next.next
化简后:
2.
cur = next; //让cur后移
cur = head.next 变成了 cur = head.next.next,把cur往后移。
数据1没有被引用,进入垃圾回收机制
- 进入循环