首页 > 其他分享 >LeetCode-19. 删除链表的倒数第 N 个结点,关于删除链表会遇见的指针问题

LeetCode-19. 删除链表的倒数第 N 个结点,关于删除链表会遇见的指针问题

时间:2024-12-19 17:58:48浏览次数:10  
标签:p2 删除 19 next 链表 节点 指针

原题链接

前言

虽然这道题比较简单,但是我在做这道题时发现了几个需要注意的地方,故写个笔记提一下。

正文

先将源代码给出来

class Solution {
public:
    ListNode* removeNthFromEnd(ListNode* head, int n) {
        ListNode* x = new ListNode();
        x->next = head;
        ListNode* p = x;
        ListNode* p2 = x;
        int idx = 0;
        do {
            idx++;
            p = p->next;
        } while (p != nullptr);

        for (int i = 1; i < idx - n; i++) {
            p2 = p2->next;
        }
        ListNode* TMP = p2->next;
        p2->next = TMP->next;
        delete TMP;
        return x->next;
    }
};

思路很简单,遍历找到链表的长度,然后再次遍历找到链表应该删除的节点,随后将其删除,但是有人(比如我)可能会犯一个错误,在答案的最后直接返回head,然而事实上在删除的节点是第一个节点的时候,这种做法是会出错的,

关于这一点,涉及我们对指针的理解。

下面来分析一下:

众所周知,链表的删除操作是依靠修改节点的 ->next 指针。在这个过程中,我们需要创建一个虚拟节点以便找到要删除的节点。当我们找到需要删除的节点时,节点的前一个节点是 p2,而要删除的节点是 TMP

当需要删除的节点不是第一个节点时,删除操作能够正确进行。这是因为我们创建的 p2 指针是一个新的指针,仍然指向链表的虚拟节点,而这个虚拟节点的 ->next 指向链表的头节点。当我们执行 p2->next = TMP->next 这一操作时,实际上是将 p2 所指向的虚拟节点的 next 指针指向了要删除节点的下一个节点,这样就能够修改链表本身的结构,从而成功地完成删除操作。

然而,当我们需要删除第一个节点时,节点的前一个节点就是虚拟节点。此时修改虚拟节点的 ->next 指针将使其指向链表的第二个节点。然而这个虚拟节点事实上并不存在于链表中,仅仅是修改这个虚拟节点的数值或是->next指针并不能达成修改链表的效果,因为虚拟节点的->next只是指向了head节点,如果修改这个->next值,仅仅只能表示指向改变了,而不是head改变了,所以修改这个->next指针并不能实现在head指向的链表中的第一个节点被删除的结果。

因此,通过修改虚拟节点的 ->next 指针,我们实际上可以删除链表中的第一个节点,并确保链表的结构得到正确更新。因此,我们应当返回虚拟节点的 ->next 指针,而不是直接返回 head

结语

以上的想法是我自己思考的,如果有不对的地方麻烦请指出来~

标签:p2,删除,19,next,链表,节点,指针
From: https://blog.csdn.net/qq_60409213/article/details/144526256

相关文章

  • 12.19 CW 模拟赛 T2. 数
    思路赛时读错题了,虽然说读对了不一定能做出来,但是还是比较可惜首先阐述一下题意,对\(S\)数组进行插入和删除操作,每次询问让你用\(T\)中的质数组合出\(x\),然后将\(S\)中的数乘以\(x\)之后求最多的完全立方数个数那么显然的,我们对于每一个数,都可以拆成质......
  • 12.19 CW 模拟赛 赛时记录
    前言考试的时候只需要管考试的策略就行了,其他的想他干嘛看题一般来说,涨信心模拟赛都不会涨信心像一位故人出的题?\(\rm{T1}\)相信自己,冲一下\(\rm{T2}\)看不懂\(\rm{T3}\)博弈\(\rm{T4}\)困难\(\rm{T1}\)机房两青轴是真的蚌埠思路转化题意,对于\(N\)条线......
  • 编写简单有序链表的创建和查询修改
    编写一个简单的单向链表,实现对一组长度不定的有序整数的管理(查询、插入、修改、删除)。编程要求(1)创建一个单向链表,其结点包含值(number)和序号(xuhao)两个整型数据字段(序号从1开始递增,相邻两结点的序号相差1,下同),输出该链表(按顺序从头部开始输出结点的值,相邻结点值之间用一个......
  • 今日链表初识
    前言:链表是数据结构非常常见的一种,比如在java中LinkedList,数据库中的B+TREE都用到了链表。今天我们先来认识一下,什么是链表,以及一个简单的练习反转链表。什么是链表链表是一种每个节点不光可以存储当前节点数据,并且还会保存这一个节点的指针。如图:那如何使用java语言......
  • Java学习,删除数组元素
    Java中数组的长度是固定的,这意味着不能,直接从一个数组中删除元素并期望数组自动调整其大小。可以通过几种方式,来实现删除数组元素的效果。创建一个新数组:publicclassRemoveArrayElement{  publicstaticvoidmain(String[]args){    int[]array={1,2......
  • 链表的错误处理之没把地址给到next
    void add_end_node(Node_t*head,intdata)//这里是在尾部添加节点{  Node_t*newnode=(Node_t*)malloc(sizeof(Node_t));  if(!newnode)  {    exit(1);  }  newnode->data=data;  newnode->next=NULL;  Node_t*cur=(No......
  • 有了React 19新编译器,真的就没有性能问题了吗?
    有了React19新编译器,真的就没有性能问题了吗?原文链接:HowReactCompilerPerformsonRealCode作者:Adevnadia译者:倔强青铜三前言大家好,我是倔强青铜三。我是一名热情的软件工程师,我热衷于分享和传播IT技术,致力于通过我的知识和技能推动技术交流与创新,欢迎关注我,微信......
  • 12.17双向链表和循环链表
    1.思维导图2.单向循环链表1>程序代码:头文件:#ifndef__LOOPLINK_H__#define__LOOPLINK_H__#include<stdio.h>#include<stdlib.h>//构造节点数据类型typedefintDatatype;typedefstructnode{ union { intlen; Datatypedata; }; structnode*next;}......
  • 12.16链表
    1.思维导图2.相关代码头文件linkList.h:#ifndef__LINKLIST_H__#define__LINKLIST_H__#include<stdio.h>#include<stdlib.h>typedefintDatatype;//创建节点结构体类型typedefstructnode{ union { intlen; Datatypedata; }; structnode*next;}li......
  • Windows Server 2019 配置PHP环境(图文教程)
    操作系统:WindowsServer2019运行模式:IIS10+fastcgi+PHP(安装IIS的时候选择上CGI)软件版本:MySQL5.7.37解压版/PHP7.4.29/PHPManager1.5.0/phpMyAdmin5.1.31、MySQL5.7.37解压版安装:为什么我会选择解压版而不是安装版?一是因为安装版没有64位版本;二是因为安装版......