ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

图解算法——链表中倒数第k个节点

2020-12-10 23:06:00  阅读:185  来源: 互联网

标签:ListNode latter 倒数第 链表 former 图解 节点


题目来源:

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

leetCode

题目描述:

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

示例:

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

返回链表 4->5.
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/lian-biao-zhong-dao-shu-di-kge-jie-dian-lcof
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

 

解题思路:

拿到该题目,第一想法是:

  1. 先遍历统计链表长度,记为 n;
  2. 设置一个指针走 (n-k) 步,即可找到链表倒数第 k个节点。

执行完毕后发现,情况惨不忍睹。时间4ms,内存10.9MB,才击败10.34%的对手。白瞎了我这专业真是。不过冷静下来想一想,也是,这笨办法只要是受过“高等教育”的谁不会?我表弟(高中)说他也会。鄙视........

 

 

冷静下来,想一想,确实没有必要进行二次循环。 太浪费时间了。那么如何能在一次循环中就能够找到倒数第k个节点呢???

淦,如果有一把尺子,刚好长度为k,那么在尺子前端顶到链表尾部后,那尺子尾端必然是处于链表的倒数第k个节点处啊,卧槽,那怎么办?

尺子的问题,滑动窗口的问题,卧槽,思路来了,双指针!!!对滴,没错,就是他!

流程:

1、初始化两个指针:latter和former,都指向head;

2、构造出长度为k的尺子:先让former先走k步;

3、一起走:等former走到链表尽头,latter就所在位置就是倒数第k所在位置。

以链表 1->2->3->4->5, 和 k = 2 为例:

初始化双指针:latter = head; former = head;

然后former走第一步:

 

 走第二步:

 

至此,长度为k 的 尺子构建完毕。

双指针开始同步移动:

走一步

 

 再走一步:

 

 再走一步:

 

 发现没?此时former已经指向NULL了,跳出循环。

由于题目上说倒数第k个要符合习惯。

故,此时latter所指向的节点即是倒数第k个节点,此处k=2。

有些题目上就没有说习惯的问题,所以former指针到底先走几步,到哪停,要也别注意,也要灵活运用。

 

或者:

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    ListNode* getKthFromEnd(ListNode* head, int k) {
        ListNode* former = head;
        ListNode* latter = head;
        int n = 1;
       if(head==NULL)
            return NULL;
        while(k--){
            former = former->next;
        }
        while(former!=NULL)
        {
            latter = latter->next;
            former = former->next;
        }
        return latter ;
    }
};

 

 

Over......

 

标签:ListNode,latter,倒数第,链表,former,图解,节点
来源: https://www.cnblogs.com/gjmhome/p/14117978.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有