首页 > 其他分享 >链表中倒数最后k个结点

链表中倒数最后k个结点

时间:2023-05-08 13:12:43浏览次数:38  
标签:结点 ListNode int fast 链表 len 倒数 指针

  • 描述
输入一个长度为 n 的链表,设链表中的元素的值为 ai ,返回该链表中倒数第k个节点。 如果该链表长度小于k,请返回一个长度为 0 的链表。     数据范围:0≤n≤10^5,0≤ai​≤10^9,0≤k≤10^9 要求:空间复杂度 O(n),时间复杂度 O(n) 进阶:空间复杂度 O(1),时间复杂度 O(n)   例如输入{1,2,3,4,5},2时,对应的链表结构如下图所示: 其中蓝色部分为该链表的最后2个结点,所以返回倒数第2个结点(也即结点值为4的结点)即可,系统会打印后面所有的节点来比较。  
  • 示例1
输入:{1,2,3,4,5},2 返回值:{4,5} 说明:返回倒数第2个节点4,系统会打印后面所有的节点来比较。  
  • 示例2
输入:{2},8 返回值:{}  
  • 算法思想
方法1: 先计算链表长度len,再正序寻找倒数第k个节点,即寻找第len-k+1个节点。 方法2: 双指针法。

1、准备一个快指针,从链表头开始,在链表上先走k步。

2、准备慢指针指向原始链表头,代表当前元素,则慢指针与快指针之间的距离一直都是k。

3、快慢指针同步移动,当快指针到达链表尾部的时候,慢指针正好到了倒数k个元素的位置。

 

  • 代码
 1 /**
 2  * struct ListNode {
 3  *  int val;
 4  *  struct ListNode *next;
 5  *  ListNode(int x) : val(x), next(nullptr) {}
 6  * };
 7  */
 8 class Solution {
 9   public:
10     /**
11      * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
12      *
13      *
14      * @param pHead ListNode类
15      * @param k int整型
16      * @return ListNode类
17      */
18     ListNode* FindKthToTail(ListNode* pHead, int k) {
19         //方法一
20         //计算链表长度
21         // ListNode *p=pHead;
22         // int len=0;
23         // while(p){
24         //     len++;
25         //     p=p->next;
26         // }
27         // if(k>len) return nullptr;
28         // //寻找倒数第k个节点
29         // int n=len-k+1;
30         // p=pHead;
31         // for(int i=0;i<n-1;i++)
32         //     p=p->next;
33         // return p;
34 
35         //方法二
36         ListNode* fast = pHead;
37         ListNode* slow = pHead;
38         //快指针先行k步
39         for (int i = 0; i < k; i++) {
40             if (fast != nullptr)
41                 fast = fast->next;
42             //达不到k步说明链表过短,没有倒数k
43             else
44                 return nullptr;
45         }
46         //快慢指针同步,快指针先到底,慢指针指向倒数第k个
47         while(fast!=nullptr){
48             fast = fast->next;
49             slow = slow->next;
50         }
51         return slow;
52     }
53 };

 

 

 

标签:结点,ListNode,int,fast,链表,len,倒数,指针
From: https://www.cnblogs.com/yueshengd/p/17381413.html

相关文章

  • java链表的疑惑
    head.next=tail; tail=newListNode();为什么head.next不等于tail在cpp里面head->next=tail;tail=newListNode();这时head->next==tail.这是因为head->next存放的是tail的地址,而java中head.next=tail; tail=newListNode();head.next存放的是tail的之前......
  • 四种语言刷算法之环形链表 II
    力扣142. 环形链表II1、C/***Definitionforsingly-linkedlist.*structListNode{*intval;*structListNode*next;*};*/structListNode*detectCycle(structListNode*head){if(head==NULL||head->next==NULL)returnNULL;stru......
  • (第26章)LinuxC本质中链表、二叉树和哈希表
    文章目录一、单链表的结构决定只能出栈,入栈1.链表的结构2.链表与数组的区别3.单链表所有基本操作代码(1)链表的插入(2)链表的查找(3)链表的删除(3)遍历整个链表(4)销毁整个链表4.习题5.C++NULL指针二、双向链表结构决定可以出队和入队1.在上面的单项链表上改改,得到双向链表2.改进双向链表:新增......
  • 二叉搜索树的第k个结点
    classSolution{public:TreeNode*res=NULL;voidmid(TreeNode*root,intk,int&cnt){if(!root)return;mid(root->left,k,cnt);cnt++;if(cnt==k)res=root;mid(root->right,k,cnt);......
  • 判断链表中是否有环
    描述判断给定的链表中是否有环。如果有环则返回true,否则返回false。 数据范围:链表长度 0≤n≤10000,链表中任意节点的值满足 ∣val∣<=100000要求:空间复杂度 O(1),时间复杂度 O(n) 输入分为两部分,第一部分为链表,第二部分代表是否有环,然后将组成的head头结点传入到函......
  • 力扣《环形链表Ⅱ》超详细题解
    作为经典题目的《环形链表Ⅱ》,我认为这题还是有专门出一期博客的分量的,大家也可以自己事先按照自己的理解写一写,然后再来看题解,毕竟自己悟出来的东西是比吸收别人的来的更深刻。一、题目给定一个链表的头节点 head ,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。......
  • BM3 链表中的节点每k个一组翻转
    描述将给出的链表中的节点每k 个一组翻转,返回翻转后的链表如果链表中的节点数不是k的倍数,将最后剩下的节点保持原样你不能更改节点中的值,只能更改节点本身。 数据范围:0≤n≤2000 ,1≤k≤2000 ,链表中每个元素都满足 0≤val≤1000要求空间复杂度 O(1),时间复杂度 O(n)......
  • BM2 链表内指定区间反转
    描述将一个节点数为size链表m 位置到 n位置之间的区间反转,要求时间复杂度 O(n),空间复杂度 O(1)。例如:给出的链表为 1→2→3→4→5→NULL, m=2,n=4,返回 1→4→3→2→5→NULL. 数据范围: 链表长度 0<size≤1000,0<m≤n≤size,链表中每个节点的值满足 ∣val∣≤10......
  • BM1 反转链表
    描述给定一个单链表的头结点pHead(该头节点是有值的,比如在下图,它的val是1),长度为n,反转该链表后,返回新链表的表头。 数据范围: 0≤n≤1000要求:空间复杂度 O(1) ,时间复杂度 O(n) 。 如当输入链表{1,2,3}时,经反转后,原链表变为{3,2,1},所以对应的输出为{3,2,1}。以上转......
  • LeetCode 24. 两两交换链表中的节点
    题目链接:LeetCode24.两两交换链表中的节点本题不涉及算法,直接模拟就可以了,但是模拟的过程中,最好进行画图演示,不然容易出错。想要达到两两交换链表中节点的效果,就需要按照以下三个步骤进行。同时为了将头结点和非头结点统一处理,因此新建一个虚拟头结点,初始时,cur指向虚拟头结......