关于韩顺平老师讲的数据结构,再讲到单链表反转的时候,有一个体想了很久没懂:创建节点:
class SingleLinkedList {
//先创建头节点
private HeroNode head = new HeroNode(0, "", "");
// // 添加节点到单向链表
// 思路,当不考虑当前编号顺序时,
// 1.找到当前链表的最后一个节点
// 2.将最后这个节点的next 指向新的节点
public HeroNode getHead() {
return head;
}
//第一种添加英雄的方法
public void add(HeroNode heroNode) {
//头节点不能动,使用来指示开头的,所以用一个辅助变量
HeroNode temp = head;
// 遍历链表,找到最后
while (true) {
if (temp.next == null) {
break;
}
//temp后移
temp = temp.next;
}
// 当退出while循环时,temp就指向了链表的最后
// 最后这个节点的next指向新的节点
temp.next = heroNode;
}
**加粗样式**
写反转方法:
```java
// 将单链表反转
public static void reversetList(HeroNode head) {
//如果当前链表为空,或者只有一个节点,直接输出
if(head.next==null||head.next.next==null){
return ;
}
HeroNode cur = head.next;
HeroNode next = null;
HeroNode reverseHead = new HeroNode(0,"","");
while(cur!=null){
next = cur.next;// 先暂时保存当前节点的下一个节点,因为后面需要使用
cur.next=reverseHead.next;
reverseHead.next = cur;
cur = next;
}
// 将head.next 指向 reverseHead.next , 实现单链表的反转
head.next=reverseHead.next;
}
标题
注意这里有一个地方
next = cur.next;// 先暂时保存当前节点的下一个节点,因为后面需要使用
cur.next=reverseHead.next;
reverseHead.next = cur;
cur = next;
为什么要写cur.next=reverseHead.next;?
通过debug来解释
第一次进入循环时:
发现将reverseHead.next给cur之后,cur.next为空了,很多人疑惑这步是不是写反了,其实没有
第一次循环结束时,发现reverseHead.next有值了,也就是第一个no=1,name=松江:
第二次进入循环时还是到:cur.next=reverseHead.next;
这里有个比较有趣的现象,cur是原来链表第二个,cur.next按道理来说是第三个,可是此时,cur.next是第一个了!!
此时在想,如果进行到下一步reverse.next=cur的话,那么链表连起来
就是reverseHead.next是原来链表第二个,
reverseHead.next.next是原来链表的第一个,也就实现了链表的反转,这就是为啥cur.next=reverseHead.next
继续debug:
果然是这样,链表于此处反转