算法练习篇之:链表中倒数第k个节点

算法练习篇之:链表中倒数第k个节点

题目描述

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

解题思路

看到题目,我们直观的想法是从链表头部依次遍历到链表尾端,再从尾端回溯k步。但只有双向链表才可以进行反向回溯,单链表显然是行不通的。求链表倒数第k个结点,相当于求链表正数第(n-k+1)个结点。根据这个思想,我们可以应用典型的快慢指针问题快指针先走k步,然后慢指针跟上同时向前移动,当快指针走到链表尾部时,慢指针所指即为倒数第k个元素。

图示

在这里插入图片描述
(P1:快指针 P2:慢指针)

代码实现

博客设置页面,选择一款你喜欢的代码片高亮样式,下面展示同样高亮的 代码片.


class ListNode{ //定义链表节点
    ListNode next;
    int val;
    public ListNode(ListNode listNode,int val){
        this.val=val;
        this.next=listNode;
    }
    public ListNode(){}
}

public class findKthToTail {

    //打印链表倒数第k个元素
    public ListNode findKthEleToTail(ListNode head,int k){
        if (head==null||k<=0){
            return null;
        }

        ListNode ANode=head;
        ListNode BNode=null;

        for (int i=0;i<k-1;i++){
            if (ANode.next!=null){
                ANode=ANode.next;
            }
            else {
                return null;
            }
        }
        BNode=head;
        while (ANode.next!=null){
            ANode=ANode.next;
            BNode=BNode.next;
        }
        return BNode;
    }
    public static void main(String[] args) {
        ListNode first=new ListNode();
        ListNode second=new ListNode();
        ListNode third=new ListNode();
        ListNode fourth=new ListNode();

        first.val=1; first.next=second;
        second.val=2; second.next=third;
        third.val=3; third.next=fourth;
        fourth.val=4; fourth.next=null;

        int k=2;
        findKthToTail test=new findKthToTail();
        ListNode node = test.findKthEleToTail(first,k);
        System.out.println("倒数第"+k+"个节点为:"+node);
    }
}



总结

本题来源于面试经典教材《剑指offer》中 归属于链表类型题目。
同许多在算法道路上不断前行的人一样,不断练习,修炼自己!
如有博客中存在的疑问或者建议,可以在下方留言一起交流,感谢各位!
最后,感谢Jerry算法!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值