题解 | #链表中倒数最后k个结点#

思路

使用栈暴力破解
  • 用一个stack来存储push链表每个节点

  • 然后循环k次pop出stack中的节点

时间复杂度 O(n) 空间复杂度 O(n)

计数法
  • 先统计链表中元素的数目

  • 再根据count-k的个数逆向求出需要遍历到的位置

  • 然后直接返回头节点

时间复杂度 O(n) 空间复杂度 O(1)

快慢指针
  • 先用fast快指针走k步

  • 然后fast快指针和slow慢指针同时走,直到fast快指针为空,返回slow慢指针

时间复杂度 O(n) 空间复杂度 O(1)

//解法一 使用栈
    if(!pHead) {
        return null;
    }
    let stack = [];
    while(pHead) {
        stack.push(pHead);
        pHead = pHead.next;
    }
    let target = null;
    while (k && k <= stack.length) {
        target = stack.pop();
        k--;
    }
    return target;
     
//解法二 计数法
    let count = 0;
    let head = pHead;
    let h = pHead;
    while(h) {
        count++;
        h = h.next;
    }
    if (count<k) {
        return null;
    }
    for(let i=0; i<count-k ; i++){
        head = head.next;
    }
    return head
     
//解法三 快慢指针法
    let slow = pHead;
    let fast = pHead;
    for(let i=0;i<k;i++){
        if(!fast){
            return fast;
        }
        fast = fast.next;
    }
    while(fast){
        slow = slow.next;
        fast = fast.next;
    }
    return slow;


全部评论

相关推荐

06-02 15:17
门头沟学院 Java
心爱的idea:怎么会呢 应该是打招呼有问题 问就说实习6个月全国可飞随时到岗
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务