输出链表中倒数第k个节点

输入一个链表,输出该链表倒数第k个节点。

思路详情:

使用快慢指针法,定义一个fast和一个slow。输出倒数第k个节点,那就让fast比slow先走k-1步,然后两个一起走,当fast的下一个节点为空的时候,fast就遍历完链表了,slow停下的位置,便是需要的倒数第k个节点了。

图解:

输出链表中倒数第k个节点_第1张图片

输出链表中倒数第k个节点_第2张图片

在写代码之前,我们需要考虑一下这个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类型的值,然后输出它。

你可能感兴趣的:(数据结构,数据结构,java)