服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - C/C++ - C++进阶练习删除链表的倒数第N个结点详解

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

2022-12-06 13:50Demo龙 C/C++

这篇文章主要给大家介绍了关于如何利用C++删除链表的倒数第N个结点,文中通过实例代码介绍的非常详细,对大家学习或者使用C++具有一定的参考学习价值,需要的朋友可以参考下

1.链接

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

2.题目描述

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

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.题解

方法一

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
/**
 * 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:
    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;
    }
};

方法二

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
/**
 * 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* 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++进阶练习删除链表的倒数第N个结点详解的文章就介绍到这了,更多相关C++删除链表节点内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文链接:https://zal321.blog.csdn.net/article/details/123165614

延伸 · 阅读

精彩推荐
  • C/C++c语言中abs()和fabs()的区别点整理

    c语言中abs()和fabs()的区别点整理

    在本篇文章里小编给大家分享的是关于c语言abs()和fabs()的区别,有需要的朋友们可以参考学习下。...

    李典金10102021-08-13
  • C/C++C语言 从根本上理解指针

    C语言 从根本上理解指针

    C语言这门课程在计算机的基础教学中一直占有比较重要的地位,然而要想突破C语言的学习,对指针的掌握是非常重要的,本文将具体针对指针的基础做详...

    清风自在 流水潺潺3912022-11-11
  • C/C++C++实现会员管理程序

    C++实现会员管理程序

    这篇文章主要为大家详细介绍了C++实现会员管理程序,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    TwcatL_tree5942021-09-17
  • C/C++快速了解Boost.Asio 的多线程模型

    快速了解Boost.Asio 的多线程模型

    这篇文章主要介绍了Boost.Asio 的多线程模型的相关知识,文中代码非常详细,供大家参考和学习,感兴趣的朋友可以了解下...

    Boblim7862021-09-09
  • C/C++c++显式栈实现递归介绍

    c++显式栈实现递归介绍

    大家好,本篇文章主要讲的是c++显式栈实现递归介绍,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下...

    qhh_enen5412022-08-11
  • C/C++C++实现堆排序实例介绍

    C++实现堆排序实例介绍

    大家好,本篇文章主要讲的是C++实现堆排序实例介绍,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下,方便下次浏览...

    NEU!8002022-07-22
  • C/C++C语言贪吃蛇经典小游戏

    C语言贪吃蛇经典小游戏

    这篇文章主要为大家详细介绍了C语言贪吃蛇经典小游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    XHfight10892021-06-19
  • C/C++vscode搭建STM32开发环境的详细过程

    vscode搭建STM32开发环境的详细过程

    这篇文章主要介绍了vscode搭建STM32开发环境的详细过程,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...

    顶点元8832021-11-03