iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C++进阶练习删除链表的倒数第N个结点详解
  • 457
分享到

C++进阶练习删除链表的倒数第N个结点详解

2024-04-02 19:04:59 457人浏览 安东尼
摘要

目录1.链接2.题目描述3.解题思路4.题解1.链接 19. 删除链表的倒数第 N 个结点. 2.题目描述 3.解题思路 方法一 1.在对链表进行操作时,一种常用的技巧是添加一个哑

1.链接

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

2.题目描述

3.解题思路

方法一

1.在对链表进行操作时,一种常用的技巧是添加一个哑节点(dummy node),它的 next指针指向链表的头节点。这样一来,我们就不需要对头节点进行特殊的判断了。

例如,在本题中,如果我们要删除节点 y,我们需要知道节点 y 的前驱节点 x,并将 x 的指针指向 y 的后继节点。

但由于头节点不存在前驱节点,因此我们需要在删除头节点时进行特殊判断。但如果我们添加了哑节点,那么头节点的前驱节点就是哑节点本身,此时我们就只需要考虑通用的情况即可。特别地,在某些语言中,由于需要自行对内存进行管理。因此在实际的面试中,对于「是否需要释放被删除节点对应的空间」这一问题,我们需要和面试官进行积极的沟通以达成一致。下面的代码中默认不释放空间。

一种容易想到的方法是,我们首先从头节点开始对链表进行一次遍历,得到链表的长度 L。随后我们再从头节点开始对链表进行一次遍历,当遍历到第 L−n+1 个节点时,它就是我们需要删除的节点。为了方便删除操作,我们可以从哑节点开始遍历 L−n+1 个节点。当遍历到第 L−n+1 个节点时,它的下一个节点就是我们需要删除的节点,这样我们只需要修改一次指针,就能完成删除操作。

方法二

我们可以设想假设设定了双指针 p 和 q 的话,当 q 指向末尾的 NULL,p 与 q 之间相隔的元素个数为 n 时,那么删除掉 p 的下一个指针就完成了要求。

设置虚拟节点 dummyHead 指向 head

设定双指针 p 和 q,初始都指向虚拟节点 dummyHead

移动 q,直到 p 与 q 之间相隔的元素个数为 n

同时移动 p 与 q,直到 q 指向的为 NULL

将 p 的下一个节点指向下下个节点

4.题解

方法一


class Solution {
public:
    int getLength(ListNode* head) {
        int length = 0;
        while (head) {
            ++length;
            head = head->next;
        }
        return length;
    }
    ListNode* removeNthFromEnd(ListNode* head, int n) {
        ListNode* dummy = new ListNode(0, head);
        int length = getLength(head);
        ListNode* cur = dummy;
        for (int i = 1; i < length - n + 1; ++i) {
            cur = cur->next;
        }
        cur->next = cur->next->next;
        ListNode* ans = dummy->next;
        delete dummy;
        return ans;
    }
};

方法二


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

        ListNode* p = dummyHead;
        ListNode* q = dummyHead;
        for( int i = 0 ; i < n + 1 ; i ++ ){
            q = q->next;
        }
        while(q){
            p = p->next;
            q = q->next;
        }
        ListNode* delNode = p->next;
        p->next = delNode->next;
        delete delNode;
        ListNode* retNode = dummyHead->next;
        delete dummyHead;
        return retNode;
    }
};

到此这篇关于c++进阶练习删除链表的倒数第N个结点详解的文章就介绍到这了,更多相关C++删除链表节点内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: C++进阶练习删除链表的倒数第N个结点详解

本文链接: https://www.lsjlt.com/news/149144.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • C++进阶练习删除链表的倒数第N个结点详解
    目录1.链接2.题目描述3.解题思路4.题解1.链接 19. 删除链表的倒数第 N 个结点. 2.题目描述 3.解题思路 方法一 1.在对链表进行操作时,一种常用的技巧是添加一个哑...
    99+
    2024-04-02
  • LeetCode题解之如何删除链表倒数第n个结点
    这篇文章主要讲解了“LeetCode题解之如何删除链表倒数第n个结点”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“LeetCode题解之如何删除链表倒数第n...
    99+
    2024-04-02
  • List怎么删除链表的倒数第N个节点
    本篇内容介绍了“List怎么删除链表的倒数第N个节点”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!问题:删除链表的倒数第N个节点题目给定一个...
    99+
    2023-06-19
  • C++实现移除链表倒数第N个节点
    这篇文章主要讲解了“C++实现移除链表倒数第N个节点”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C++实现移除链表倒数第N个节点”吧! Remove Nth Node From ...
    99+
    2023-06-20
  • C++实现LeetCode(19.移除链表倒数第N个节点)
    [LeetCode] 19. Remove Nth Node From End of List 移除链表倒数第N个节点 Given a linked list, remove the...
    99+
    2024-04-02
  • 怎么找到链表的倒数第n个结点
    本篇内容主要讲解“怎么找到链表的倒数第n个结点”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么找到链表的倒数第n个结点”吧!什么意思呢我们以下面这个链表为例:...
    99+
    2024-04-02
  • C++解决输出链表中倒数k个结点的问题
    目录题目描述示例解题思路测试代码补充题目描述 输入一个长度为 n 的链表,设链表中的元素的值为 ai ,返回该链表中倒数第k个节点。 如果该链表长度小于k,请返回一个长度为 0 的链...
    99+
    2024-04-02
  • C++ 解决求两个链表的第一个公共结点问题
    目录题目描述:输入描述:返回值描述:示例:解题思路:补充题目描述: 输入两个无环的单向链表,找出它们的第一个公共结点,如果没有公共节点则返回空。(注意因为传入数据是链表,所以错误测试...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作