输入一个链表,输出该链表倒数第k个节点。
思路详情:
使用快慢指针法,定义一个fast和一个slow。输出倒数第k个节点,那就让fast比slow先走k-1步,然后两个一起走,当fast的下一个节点为空的时候,fast就遍历完链表了,slow停下的位置,便是需要的倒数第k个节点了。
图解:
在写代码之前,我们需要考虑一下这个K值合法吗?如果k值小于0,k值超过数组长度,那么这个时候k值就不合法了,这个时候我们就需要抛出异常或者返回null。如何获取链表的长度,在前面实现一个简单的单向链表里说到过。在写先走k-1步的循环里,不能漏掉k--,否则就会进入死循环。
具体实现代码如下:
class Node {
public int val;
public Node next;
public Node(int val){
this.val=val;
}
}
public class SingleLinkedList {
public Node head;
//得到链表的长度
public int size(){
Node cur=this.head;
int count=0;
while (cur!=null){
cur=cur.next;
count++;
}
return count;
}
public Node FindKthToTail(int k){ //输出链表的倒数第k个节点
//判断k是否合法
if(k<=0||k>size()){
throw new RuntimeException("k值不合法!");
}
Node fast=head;
Node slow=head;
while (k-1>0){ //先走k-1步
fast=fast.next;
k--;
}
while (fast.next!=null){
fast=fast.next;
slow=slow.next;
}
return slow;
}
}
调用方法输出倒数第k个节点的值:
public static void main(String[] args) {
SingleLinkedList singleLinkedList=new SingleLinkedList();
// 在这里要先创建一个链表,在调用
Node ret= singleLinkedList.FindKthToTail(k);
System.out.println(ret.val);
}
运行main前,需要先创建一个链表,详细做法参考实现一个简单的单向链表,因为前边使用的类型是Node,所以在我们调用方法的时候,需要定义一个Node类型的值,然后输出它。