链表的基础内容详见:https://blog.csdn.net/Zhouzi_heng/article/details/108759239
这次学习的是单链表的反转
1、开辟新的内容空间进行反转
思路:
(1)先定义一个新的头结点newHead(不存数据)
(2)遍历原来的节点,每遍历一个结点,就将其取出,并放在newHead的后面,其实就是创建链表时的尾插法。
图一
定义一个新的节点,它的next指向null。
图二
将原链表中的cur(未移动前)的next指向newHead的next,再将newHead的next指向cur(Node1)。
将cur的next赋值给cur,再将curNext后移,即称为图二的模样。
图三
重复2,一直重复,直到cur==null
再将原表头Head指向newHead的next 。
具体代码:
public static HeroNode reverseNode(HeroNode head){
//空链表和只有一个节点的判断
if(head.next == null||head.next.next == null){
return head;
}
//定义赋值变量
HeroNode cur = head.next; //当前节点
HeroNode curNext = null; //当前节点(cur)的下一个结点
//中间变量的头结点
HeroNode newHead = new HeroNode(0,"","");
while(cur != null){
curNext = cur.next; //保留当前节点的下一个结点
cur.next = newHead.next;
newHead.next = cur;
cur = curNext;
}
head.next = newHead.next;
return head;
}
2、直接在遍历的时候做断链和连链操作
此时需要两个指针联动来修改。
首先:cur指向第一个数据结点,curNext指向cur的下一个位置。
再将cur的next指向curNext的next,即cur现在指向第三个数据结点;
第三步:将curNext的next指向head的next;
最后:将head的next指向curNext。
其实就是每次将curNext移到head后面。
需要借助画图去理解代码。
具体代码
public static void reverseList(HeroNode head){
//非空判断
if(head.next == null || head.next.next == null){
return ;
}
HeroNode cur = head.next; //当前节点
HeroNode curNext = null; //当前节点的下一个节点
while(cur.next != null){
curNext = cur.next; //保留
cur.next = curNext.next;
curNext.next = head.next;
head.next = curNext;
}
}