解决方法:
使用快慢指针,慢指针先不动,快指针先走k-1步,然后两个指针一起以同样的速度走。当快指针到达终点时,慢指针正好停留在倒数第k-1个节点。因为它们之间的距离始终保持k-1。
代码如下:
package com.guigu.LinkedListDemo;
public class SpeedAndSlow {
public static void main(String[] args) {
// 创建一个单链表
LinkedList list = new LinkedList();
HNode hNode1 = new HNode(1, "tom");
HNode hNode2 = new HNode(2, "jack");
HNode hNode3 = new HNode(3, "simth");
HNode hNode4 = new HNode(4, "cls");
list.add(hNode1);
list.add(hNode2);
list.add(hNode3);
list.add(hNode4);
// 遍历链表
list.list();
System.out.println();
int k = 3;
HNode lock = getBackwardsK(list, k);
System.out.printf("倒数第%d个节点是%s", k, lock.name);
}
public static HNode getBackwardsK(LinkedList list, int k) {
HNode speed = list.head; // 定义一个快指针,初始化为head
HNode slow = list.head; // 定义一个慢指针,初始化为head
// 当快指针走到链表尾的时候退出
while(speed.next != null) {
if(--k > 0) { // 让快指针先走k-1步
speed = speed.next;
}else {
// 快指针和慢指针一起走
speed = speed.next;
slow = slow.next;
}
}
// 此时慢指针所在的位置就是倒数第k个节点
if(k > 0) {
return null;
}
return slow;
}
}