剑指 Offer 22. 链表中倒数第k个节点

Posted on   AcTourist  阅读(27)  评论(0编辑  收藏  举报

一、题目

 

二、题目分析

  1.第一种解法:遍历两次,第一次遍历求出链表长度,第二次遍历找到k 个节点,为什么要怎么做:本题中的链表是单向链表,单向链表的节点只有从前往后的指针而没有从后往前的指针;假设整个链表有n个节点,那么倒数第K个节点就是从头节点开始的第n-k个节点。

  2.第二解法:双指针解法;快慢指针,fast的指针要先走k+1,slow的指针要再head的位置上,此时fast - slow = k ;所以两个指针分别都向链表后面走,当fast指向为空的时候,slow的位置就在k上,如何去实现?先让fast slow都在head上,然后让fast先走k+1的节点

三、代码

复制代码
/**
 * Definition for singly-linked list.
 * function ListNode(val) {
 *     this.val = val;
 *     this.next = null;
 * }
 */
/**
 * @param {ListNode} head
 * @param {number} k
 * @return {ListNode}
 */
var getKthFromEnd = function(head, k) {
    let p = head;
    let sum =0;
    //计算链表长度
    while(p){
        p = p.next;
        sum ++;
    }
    p = head;
    for(let i = 0; i < sum-k; i++){
        p = p.next;
    }
    return p;
};
复制代码
复制代码
/**
 * Definition for singly-linked list.
 * function ListNode(val) {
 *     this.val = val;
 *     this.next = null;
 * }
 */
/**
 * @param {ListNode} head
 * @param {number} k
 * @return {ListNode}
 */
var getKthFromEnd = function(head, k) {
    let fast = head, slow = head;
    while(fast && k){
        fast = fast.next;
        k--;
    }
    while(fast){
        fast = fast.next;
        slow = slow.next;
    }
    return slow;
};
复制代码

 

相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
点击右上角即可分享
微信分享提示