【剑指Offer】22.遍历一次找到链表中倒数第k个节点(JS实现)

该博客介绍了如何在单链表中找到倒数第k个节点的问题,提供了两种解决方案:一是先遍历链表获取总节点数,再遍历找到目标节点;二是使用双指针法,先让一个指针移动k-1步,再同步移动直至第一个指针到达链表末尾,此时第二个指针指向的就是倒数第k个节点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目描述

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

示例:

给定一个链表: 1->2->3->4->5, 和 k = 2.
返回链表 4->5.

题目解答

遍历两次链表

var getKthFromEnd = function(head, k) {
    var p = head;
    var numOfNode = 1;
    while(p.next!=null){
        p = p.next;
        numOfNode++;
    }
    if(numOfNode>=k){
        var goHead = numOfNode - k + 1;
        var p =head;
        var numOfNode = 1;
        while(goHead > numOfNode){
            p = p.next;
            numOfNode++;
        }
        return p;
    }
};

首先顺序遍历链表,计算出链表中节点的总个数numofNode。然后计算倒数第k个节点是正数第几个节点,再次遍历链表到对应的节点。

遍历一次链表

var getKthFromEnd = function(head, k) {
    //head为空
    if(head==null||k==0){
        return 0;
    }
    var pBegin = head;
    var pEnd = head;
    var step = k-1;
    while(pEnd.next!=null&&step){
        pEnd = pEnd.next;
        step--;
    }
    while(pEnd.next!=null){
        pBegin = pBegin.next;
        pEnd = pEnd.next;
    }
    return pBegin;

};

定义两个指针,当后一个指针指向最后一个节点时,前一指针刚好指向倒数第k个节点。要实现这一想法,两个指针必须间隔k-1。

先提前移动其中一个指针k-1步,然后两个指针一起向前移动,当在前的指针移动到链表尾部,后一指针将刚好移动到对应位置。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值