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

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

思路详情:

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

图解:

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5bCP5p-S5ZCWfg==,size_20,color_FFFFFF,t_70,g_se,x_16

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5bCP5p-S5ZCWfg==,size_20,color_FFFFFF,t_70,g_se,x_16

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

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值