链表中倒数第k个节点(剑指Offer 第14 题)

题目描述:


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


解题思路:


主要介绍两种方法:

1. 链表逆序+前第k个节点(容易想到的)
2. 快慢指针


1 . 链表逆序 + 前第k个节点

这里面难度主要就是前面的链表逆序,先介绍它!
这里写图片描述
如上图,我们在遍历链表的同时,将链表进行逆序!主要分为以下几步:

public ListNode converseList(ListNode head){

        ListNode newHead = null;//逆序链表的头节点,一开始为null,对应到图中的1指向的null。

        while(head != null){//遍历原链表
            ListNode newNode = head;//将遍历到的节点1先存起来(若不存,后面head很快就被覆盖掉了!)
            head = head.next;//下一个节点(此时,节点1对于原链表任务已经结束,可以任意操作节点1了!)
            newNode.next = newHead;//将节点1指向null
            newHead = newNode;//将节点1设置为反转链表的头节点。
        }
        return newHead;
    }

上面的注释,详细介绍了一个周期,后面的每个节点都是这个周期操作!
那么,后面找第k个就很简单了, 代码就不了附!


2 . 快慢指针

这里写图片描述

原理,见上面的图,应该能够一眼看明白了!
下面主要结合代码看看具体怎么实现!

public class Solution {
    public ListNode FindKthToTail(ListNode head,int k) {

        int count = 1;//快指针计数
        ListNode fast = head;//快指针
        ListNode slow = head;//慢指针

        while(fast != null){
            if(count > k){//此时,快指针到第k个节点,慢指针开始行动
                slow = slow.next;
            }
            fast = fast.next;
            count++;
        }
        if(count<=k)//循环结束后,要判断特殊情况,k值大于链表长度的情况
            return null;
        else
            return slow;
    }
}

End

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值