一、单链表长度的获取
1.代码实现
//方法:获取到单链表的节点的个数(如果是带头节点的链表,需求不统计头节点)
public static int getLength(HeroNode heroNode){
if(heroNode.next == null){
return 0;
}
int length = 0;
//定义一个辅助变量,这里我们没有统计头节点
HeroNode cur = heroNode.next;
while(cur != null){
length++;
cur = cur.next;
}
return length;
}
二、查找单链表中倒数第K个元素
1.思路
//1、编写一个方法,接收head节点,同时接收一个index
//2、index表示倒数第index个节点
//3、先把链表从头到尾遍历,得到链表的总长度 调用下getLength()
//4、得到size后,从链表的第一个开始遍历,遍历(size-index)个
2.代码实现
代码如下(示例):
public static HeroNode findLastNode(HeroNode head,int index){
//判断链表为空,返回Null
if(head.next == null){
return null;
}
//第一次遍历得到链表的长度
int size = getLength(head);
//第二次遍历
//先做一个index的校验
if(index <=0 || index >size){
return null;
}
//定义辅助变量,for循环定位到倒数的index
HeroNode temp = head.next;
for(int i = 0;i < size - index;i++){
temp = temp.next;
}
return temp;
}
三、单链表的反转
1.思路
//1、先定义一个节点 HeroNode reverseHead = new HeroNode()
//2、从头到位遍历原来的链表,每遍历一个节点就将其取出,放在新链表的最前端
//3、原来的链表的head.next = reverseHead.next
2.代码实现
public static void reverseList(HeroNode head){
//如果当前链表为空或只有一个节点,则直接返回
if(head.next == null ||head.next.next == null){
return ;
}
//定义一个辅助的变量,帮助我们遍历原来的链表
HeroNode cur = head.next;
HeroNode next = null;//指向cur的下一个节点
HeroNode reverseHead = new HeroNode(0,"","");
while(cur != null){
next = cur.next;//先暂时保存当前的下一个节点,因为后面要使用
cur.next = reverseHead.next;//将cur的下一个节点指向新的链表的最前端
reverseHead.next = cur;//将cur连接到新的链表上
cur = next;//让cur后移
}
//将head.next指向reversrHead.next 实现反转
head.next = reverseHead.next;
}