首页 > 其他分享 >19. 删除链表的倒数第n个节点

19. 删除链表的倒数第n个节点

时间:2025-01-09 13:10:52浏览次数:1  
标签:slow ListNode 19 nullptr fast next 链表 dummyHead 倒数第

题目

卡哥思路

卡哥是用双指针来解题,我没想出来这个思路。

精华部分:

双指针的经典应用,如果要到达倒数第n个节点,让fast移动n步,然后让fast和slow同时移动,直到fast指向链表末尾(nullptr)。slow所指向的节点就是倒数第n个节点。

跟着卡哥代码敲了下:

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode() : val(0), next(nullptr) {}
 *     ListNode(int x) : val(x), next(nullptr) {}
 *     ListNode(int x, ListNode *next) : val(x), next(next) {}
 * };
 */
class Solution {
public:
    ListNode* removeNthFromEnd(ListNode* head, int n) {
        ListNode *dummyHead = new ListNode(0);
        dummyHead->next = head;
        ListNode *fast = dummyHead;
        ListNode *slow = dummyHead;
        while (n-- && fast != nullptr)
        {
            fast = fast->next;
        }
        fast = fast->next;
        while (fast != nullptr)
        {
            slow = slow->next;
            fast = fast->next;
        }
        ListNode *tmp = slow->next;
        slow->next = tmp->next;
        delete tmp;
        ListNode *result = dummyHead->next;
        delete dummyHead;
        return result;
    }
};

不过卡哥的视频讲解部分认为这样写更好,更安全。(即让n先加一,而不是后面再做一步fast = fast->next;,这样做规避了n很大导致在做fast = fast->next;时fast已经为nullptr的风险)

代码如下:

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode() : val(0), next(nullptr) {}
 *     ListNode(int x) : val(x), next(nullptr) {}
 *     ListNode(int x, ListNode *next) : val(x), next(next) {}
 * };
 */
class Solution {
public:
    ListNode* removeNthFromEnd(ListNode* head, int n) {
        ListNode *dummyHead = new ListNode(0);
        dummyHead->next = head;
        ++n;
        ListNode *slow = dummyHead;
        ListNode *fast = dummyHead;
        while (n-- && fast != nullptr)
            fast = fast->next;
        while (fast != nullptr)
        {
            slow = slow->next;
            fast = fast->next;
        }
        ListNode *tmp = slow->next;
        slow->next = slow->next->next;
        delete tmp;
        return dummyHead->next;
    }
};

标签:slow,ListNode,19,nullptr,fast,next,链表,dummyHead,倒数第
From: https://www.cnblogs.com/hisun9/p/18661942

相关文章

  • 移民统计年鉴(1996-2021年)-社科数据
    移民统计年鉴(1996-2021年)-社科数据https://download.csdn.net/download/paofuluolijiang/90028564https://download.csdn.net/download/paofuluolijiang/90028564移民统计年鉴(1996-2021年)提供了一个全面的视角,以了解全球移民趋势和数据。这份年鉴详细记录了每年的全球移民......
  • 160. 相交链表
    [题目连接](160.相交链表-力扣(LeetCode))解题思路:短链表长度为x,长链表长度为y,想让长链表走y-x,然后两个链表同时走,如果相遇直接返回,否则返回空即可。注意,题目明确了,两个链表无环代码classSolution:defgetIntersectionNode(self,headA:ListNode,headB:Li......
  • FreeRTOS-链表
    链表链表是freertos的一个重要数据结构,后面的任务调度等功能当中,都是基于链表这一项进行的。FreeRTOS的链表是指针指向的链表,一个链表下面有很多链表,每个链表项都有一个指向这个链表的指针。链表实现链表根节点一个链表的数据结构定义如下:typedefstructxLIST{listF......
  • 洛谷 P1928 外星密码
    好久不见,随便找一题找找感觉。递归写法:#include<bits/stdc++.h>usingnamespacestd;strings;stringtimes(stringx,intcnt){ stringnewstr=""; while(cnt--)newstr+=x; returnnewstr;}pair<string,int>decompress(intpos){ intnum=0; stringte......
  • 洛谷 P2754 [CTSC1999] 家园 / 星际转移问题——题解
    #ifdefONLINE_JUDGE#else#defineQiu_Cheng#endif#include<bits/stdc++.h>#defineintlonglongusingnamespacestd;//typedeflonglongll;constintN=2e6+5,mod=1e9+7,inf=INT_MAX;//constintmod1=469762049,mod2=998244353,mod3=1004535......
  • 基于 GEE Landsat C02 数据集合成 1986-2023 年的逐年年均 NDVI、多年均值、多年均值
    目录1完整代码2运行结果1完整代码//感兴趣的区域信息varroi=ee.FeatureCollection('projects/ee-zhangkanghnust/assets/HengShaoLou');Map.centerObject(roi);Map.addLayer(roi,{'color':'grey'},'roi');//Appliesscalingfactors.......
  • 蓝桥19865 线性规划
    太久没碰这种数学了,写的比较笨数列前k项≤2N的情况进行线性规划,约束条件有a+(k-1)d≤2n,a+kd>2n,前k项求和>2n在k≥3时,约束条件2包含约束条件3,a+(k-1)d≤2n,a+kd>2n,在[3,inf)上区域求和,就是a+2d≤2nk=1,2为特殊情况,k=1时无法满足,k=2时约束条件......
  • Tableau 2019中文版下载:附安装包+详细安装步骤
    如大家所了解的,Tableau是一个可视化分析平台,它改变了我们使用数据解决问题的方式,使个人和组织能够充分利用自己的数据。它帮助用户创建不同的图表、图形、地图、仪表板和故事来可视化和分析数据,以帮助做出业务决策。使用Tableau生成的数据因其易于理解的格式而易于各个级别的......
  • Matlab2019a安装C2000 Processors超详细过程
    ⭐1.环境搭建⭐链接1EmbeddedCoderSupportPackageforTexasInstrumentsC2000Processors-FileExchange-MATLABCentral......
  • 19. 弹簧控件
    一、弹簧控件  PySide6中提供了两种弹簧,分别是水平弹簧和垂直弹簧,但这两种控件对应的类都是QSpacerItem类,水平和垂直主要通过宽度和高度(水平弹簧默认的宽度和高度分别是40,20;而垂直弹簧的默认宽度和高度分别是20、40)进行区分。  我们可以在终端中使用pip安装pyside6......