目录
单链表倒数第k个节点
思路
1.编写一个方法,接受head节点,同时接受index
2.index表示倒数第index个节点
3.先把链表从头到尾遍历,得到链表的总长度getLength
4.得到size后,从链表第一个开始遍历(size-index)个
5.找到返回该节点,未找到返回空
代码实现
public static HeroNode findLastIndexNode(HeroNode head,int index) {
if (head.next==null) {
return null;
}
//第一次遍历,得到链表长度
int size=getLength(head);
//第二次遍历 size-index位置,就是倒数第k个节点
if (index<=0||index>size) {
return null;
}
//定义辅助变量,for循环定位倒数的index
HeroNode cur=head.next;
for (int i = 0; i < size-index; i++) {
cur=cur.next;
}
return cur;
}
单链表反转
思路
- 先定义一个新的头节点,reverseHead=new HeroNode();
- 从头到尾遍历原链表,每遍历一个节点,就将其取出,并放在新的链表reverseHead的最前端。
- 原来的链表的head.next=reverseHead.next
代码实现
//将单链表进行反转
public static void reversetList(HeroNode head) {
//如果当前节点为空,或者只有一个节点,无须反转
if (head.next==null||head.next.next==null) {
return ;
}
//定义一个辅助指针,帮助遍历原来链表
HeroNode cur=head.next;
HeroNode nextHero=null;//指向当前节点[cur]下一个节点
HeroNode reverseHead=new HeroNode(0, null, null);
//遍历原来的链表,每遍历一个节点,就将其取出,并放在新的链表reverseHead的最前端。
while (cur!=null) {
nextHero=cur.next;//保存当前节点的下一个节点
cur.next=reverseHead.next;//将cur的下一个节点指向新链表的最前端
reverseHead.next=cur;//将cur连接到新的链表上
cur=nextHero;
}
//将head.next指向reverseHead.next
head.next=reverseHead.next;
}
从尾到头打印链表
思路
方式1:先将单链表反转,再进行遍历即可。但这样会破坏原链表的结构,不可取。
方式2:可以利用栈这个数据结构,将各个节点压入栈中,利用栈的先进后出特点,就实现逆序打印。
代码实现
//逆序打印单链表
public static void reversePrint(HeroNode head) {
if (head.next==null) {
return ;
}
//创建一个栈
Stack<HeroNode> stack=new Stack<HeroNode>();
HeroNode cur=head.next;
//入栈
while(cur!=null) {
stack.push(cur);
cur=cur.next;//cur后移,这样可以压入下一个节点
}
//将栈中的节点进行打印,pop出栈
while (stack.size()>0) {
System.out.println(stack.pop());
}
}