剑指 offer 面试题 22 链表中的倒数第 k 个节点(快慢指针)

这篇博客介绍了如何在链表中找到倒数第k个节点,采用两次循环的方法和快慢指针技巧。强调了边界条件的处理,如k大于链表长度和head为null的情况,并提倡理解算法逻辑以应对类似问题。
摘要由CSDN通过智能技术生成

链表中倒数 k 个节点

个人博客

输入一个链表,输出该链表中倒数第k个节点。为了符合大多数人的习惯,本题从1开始计数,即链表的尾节点是倒数第1个节点。例如,一个链表有6个节点,从头节点开始,它们的值依次是1、2、3、4、5、6。这个链表的倒数第3个节点是值为4的节点。

题解
  • 两次循环

    • 第一次循环计算链表中的节点个数
    • 第二次循环寻找链表倒数的第 k 个节点
  • 快慢指针

    • 让后节点先走 k-1 步,然后前后节点一起向后遍历
    • 边界、负面测试
      • k 大于链表中节点的个数
      • head 是 null
    /**
     * Definition for singly-linked list.
     * public class ListNode {
     *     int val;
     *     ListNode next;
     *     ListNode(int x) { val = x; }
     * }
     */
    class Solution {
        public ListNode getKthFromEnd(ListNode head, int k) {
            ListNode front = head,behind = head,res = null;
            if(front == null)return null;
            for(int i = 0; i < k - 1; i++){
                front = front.next;
                if(front == null){
                    return null;
                }
            }
            while(front != null){
                front = front.next;
                res = behind;
                behind = behind.next;           
            }
            return res;
            
        }
    }
    

    TOuJFg

总结
  • 注意边界情况

  • 算法的逻辑应该自己一步一步退出来,这样才能举一反三

    • 比如,我们需要思考我们要找到倒数第 k 个节点,那么我们可以从后往前遍历链表,但是此链表是单向链表。所以只能求其次,求出链表的整体长度,从头结点开始走 n-k+1 步就行了
    • 那么这样子需要遍历两次,还有更优化的方法是用快慢指针。
    • 一步一步来!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值