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

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

时间:2025-01-04 20:44:00浏览次数:1  
标签:结点 dummyHead ListNode cur 19 next 链表 right 倒数第

正常思路,先遍历一遍链表得到长度,然后进行第二次遍历得到待删除结点的上一个结点

class Solution {
public:
    ListNode* removeNthFromEnd(ListNode* head, int n) {
        ListNode* dummyHead = new ListNode(0);
        dummyHead->next = head;
        ListNode* cur = dummyHead;
        
        int l = 0;

        while( cur->next != nullptr )
        {
            l++;
            cur = cur->next;
        }
        
        if(l==1)
         return nullptr;
         else
         {
            //找到待删除结点的上一个结点,如果是删除链表第一个结点,则不移动cur,因此cur初始为dummyHead
			cur = dummyHead;
            for(int i=0; i<(l-n); i++)
            {
                cur = cur->next;
            }
             cur->next = cur->next->next;
             
              return dummyHead->next;
         }
        
    }
};

进阶:使用一遍循环。
其实就是想办法在不知道链表长度的情况下找到待删除结点前一个结点,将链表分为三段:l-n-1 1 n。 虽然不知道l的值,但是可以利用通过双指针的方式遍历链表剩余部分的方式来得到这个长度。

class Solution {
public:
    ListNode* removeNthFromEnd(ListNode* head, int n) {
        ListNode* dummyHead = new ListNode(0);
        dummyHead->next = head;
        ListNode* left = dummyHead;
        ListNode* right = dummyHead;

        //right指向第n个结点
        while(n-- && right->next != nullptr )
        {
            right = right->next;
        }

        //left与right移动相同的步长
        //为了删除,left应该指向第l-n-1个结点
        //若使right还能移动l-n-1,则还需要移动一步
        right = right->next;
        while(right != nullptr)
        {
            right = right->next;
            left = left->next;
        }
        left->next = left->next->next;
        return dummyHead->next;
    }
};

标签:结点,dummyHead,ListNode,cur,19,next,链表,right,倒数第
From: https://www.cnblogs.com/gqzz/p/18652390

相关文章

  • 24. 两两交换链表中的节点(中)
    目录题目法一、迭代法二、递归题目给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。法一、迭代varswapPairs=function(head){letdummy={next:head}letp1=dummywhil......
  • 【Vim Masterclass 笔记07】S05L19:Vim 剪切、复制、粘贴操作同步练习
    文章目录S05L19Vim剪切、复制、粘贴操作同步练习(Exercise05-Cut,CopyandPaste)1训练目标2操作指令2.1打开dyp.txt文件2.2交换文件的头两行2.3将文件首行put到文件其他为止2.4练习在光标位置的上方粘贴文本行2.5通过交换字符顺序更正存在的笔误2.6交换......
  • 24 两两交换链表中的节点
    思路简单,但是操作的时候还是要注意细节,特别是某些结点的next指针变化需要格外关注,报了很多次错。因为没注意到:每次替换两个结点后,应该让当前的后面的结点指向下两个结点的靠后一点的结点。主要还是画完图后没有走一遍链表classSolution{public:ListNode*swapPairs(List......
  • 单链表的一些操作(c语言):插入头节点、尾节点、删除某个节点
    #include<stdio.h>#include<stdlib.h>structNode{  intdata;  structNode*Next;  /*data*/};typedefstructNodenode;node*Link;// 创建一个新的节点node*CreateNewNode(intdata){  node*NewNode=(node*)malloc(sizeof(node......
  • 2019浙教版 高中信息技术 必修1 数据与计算《第一章 数据与信息》大单元整体教学设计[
    2019浙教版高中信息技术必修1数据与计算《第一章数据与信息》大单元整体教学设计[2020课标]一、内容分析与整合二、《普通高中信息技术课程标准(2017年版2020年修订)》分解三、学情分析四、大主题或大概念设计五、大单元目标叙写六、大单元教学重点七、大单元教学难点八......
  • 数据结构:循环单链表
    循环单链表(CircularSinglyLinkedList)循环单链表是单链表的一种变体,其特点是链表的尾节点指向头节点,形成一个闭环。这种结构允许在链表中进行无缝的遍历,并且可以从任何节点开始遍历整个链表。循环单链表通常用于需要循环访问元素的场景,如轮询调度、环形缓冲区等。1.节点结......
  • 各省碳排放面板数据(1990-2022年)
    碳排放是指人类活动产生的二氧化碳(CO2)等温室气体释放到大气中的过程。通过划分排放源的范围以避免重复计算的思想,由世界资源研究所在关于企业温室气体排放清单编制的指南中首次提出。城市碳排放核算边界界定借鉴该思想,可分为3大范围一、数据介绍数据名称:各省碳排放数据......
  • dlib 19.24.6 error
         dlib19.24.6pipinstalldlibCopyPIPinstructionsLatestversionReleased: Aug10,2024 Atoolkitformakingrealworldmachinelearninganddataanalysisapplications Navigation Projectdescription Release......
  • 编程题-删除排序链表中的重复元素
    题目:给定一个已排序的链表的头 head , 删除所有重复的元素,使每个元素只出现一次 。返回已排序的链表 。解题由于给定的链表是排好序的,因此重复的元素在链表中出现的位置是连续的,因此我们只需要对链表进行一次遍历,就可以删除重复的元素。本题较为简单,笔者不做过多解释,......
  • Day3算法练习——链表篇
    反转链表用头插法即可解决,双指针就能实现原地头插法,板子题需要熟练还是要理一下,简单题不能卡两两交换链表中的节点加上虚拟头节点会好很多指针多了,模拟起来比较麻烦,建议画图删除链表的倒数第N个结点slow指向要删的结点之前而不是要删的结点,会简单不少理清楚n个结点......