来源于尚硅谷的老师代码,只因其中有几行代码自己课上没听明白,课后自己整理了一下
首先完整代码如下:
//将单链表反转
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) { //如果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;//注意head才是真正的头,reverseHead只是用来临时当一下头节点
}
代码实现的功能如下图:
下面对代码的关键位置插入了图片进行说明:
//将单链表反转
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) { //如果cur=null,说明已经遍历结束
next = cur.next;//先暂时保存当前节点的下一个节点,因为后面需要使用
下图考虑一个中间情况:
cur.next = reverseHead.next;//将cur的下一个节点指向新的链表的最前端
reverseHead.next = cur; //将cur 连接到新的链表上
cur = next;//让cur后移
}
(如上图,此时除了head头节点没连上外,其他的都已经逆序了)
//将head.next 指向 reverseHead.next , 实现单链表的反转
head.next = reverseHead.next;//注意head才是真正的头,reverseHead只是用来临时当一下头节点
}