当前位置: 首页 > news >正文

C++ 删除链表的倒数第N个结点

C++ 删除链表的倒数第N个结点

  给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。

示例 1

效果图

输入:head = [1,2,3,4,5], n = 2
输出:[1,2,3,5]

示例2

输入:head = [1], n = 1
输出:[]

示例3

输入:head = [1,2], n = 1
输出:[1]

提示:

  • 链表中结点的数目为 sz
  • 1 <= sz <= 30
  • 0 <= Node.val <= 100
  • 1 <= n <= sz

思路/解法

方式一

使用一个vector容器保存当前链表的所有节点即可。

TIPS:

  在删除结点的时候需要分三种情况进行讨论:

  1. 当删除的结点为最后一个结点时,需要判断当前的结点是一个还是多个。
  2. 当删除的结点为第一个结点时(由于第一种情况已经判断删除最后一个结点且当前总结点为一个的情况,所以这里不需要判断删除一个结点且结点个数为1的情况),直接删除并更新下一个结点即可。
  3. 当删除的结点为普通节点时,直接删除并更新下一结点即可。
/**
 * 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* node   = head;
        ListNode* temp   = nullptr;
        int       size   = 0;
        bool      status = false;
        std::vector<ListNode*> lists;
        while(node != nullptr)
        {
            lists.push_back(node);
            node = node->next;
        }
        
        size = lists.size();
        if(1 == n)                      //删除最后一个元素
        {
            if(1 == size)
            {
                delete lists[0];
                goto Exit;
            }
            else
            {
                delete lists[size - 1];
                lists[size - 2]->next = nullptr;
            }
        }
        else if(size == n)              //删除第一个元素
        {
            delete lists[0];
            head = lists[1];
        }
        else
        {
            lists[size - n - 1]->next = lists[size - n + 1];
            delete lists[size - n];
        }
        status = true;
    Exit:
        if(!status)
        {
            head = nullptr;
        }
        return head;
    }
};

方式二

快慢指针,一开始快慢指针都指向head结点。在删除倒数第N个结点时,先让快指针指向第N+1个结点的位置,然后慢指针跟随快指针移动,直至快指针的下一个结点为空即可,此时慢指针指向需要删除的结点的前一个结点。

TIPS:算法未释放指针指向的动态空间。

/**
 * 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* quickPtr = head;
        ListNode* slowPtr  = head;
        bool      status   = false;
        int       size     = n;
        while(size)
        {
            quickPtr = quickPtr->next;
            size--;
        }

        if(nullptr == quickPtr)                  
        {
            if(1 == n)                              //链表只有一个结点
            {
                goto Exit;
            }
            else                                    //删除第一个结点
            {
                head = head->next;
            }
        }
        else
        {
            while(quickPtr->next != nullptr) 
            {
                quickPtr = quickPtr->next;
                slowPtr  = slowPtr->next;
            }

            slowPtr->next = slowPtr->next->next;    //删除结点
        }

       status = true;
    Exit:
        if(!status)
        {
            head = nullptr;
        }
        return head;
    }
};

相关文章:

  • Pinia的使用
  • java — 认识String类的常用方法(上)
  • 高速专线不打烊 DPDK Hotplug助你实现设备动态管理
  • 【数据结构 二叉树 递归与非递归遍历】
  • 微信公众号消息推送教程
  • MiddleWare ❀ Zookeeper基础概述
  • 多任务学习算法在推荐系统中的应用
  • webpack5入门教程
  • Python解决多个服务线程/进程重复运行定时任务的问题
  • webpack学习笔记
  • 01人机交互/打开CMD/常见CMD命令/CMD打开QQ并设置环境变量
  • QT汽车客运公司售票系统(改良版)
  • 初始Cpp之 六、内存分配
  • 【算法】重载sort的cmp的题
  • STC15单片机-LED闪烁(定时器)
  • 分享一款快速APP功能测试工具
  • 《Java编程思想》读书笔记-对象导论
  • ES学习笔记(10)--ES6中的函数和数组补漏
  • jquery ajax学习笔记
  • Laravel核心解读--Facades
  • nginx 负载服务器优化
  • Rancher-k8s加速安装文档
  • vue2.0项目引入element-ui
  • XForms - 更强大的Form
  • 半理解系列--Promise的进化史
  • 得到一个数组中任意X个元素的所有组合 即C(n,m)
  • 高度不固定时垂直居中
  • 前端每日实战 2018 年 7 月份项目汇总(共 29 个项目)
  • 前端相关框架总和
  • 浅谈Golang中select的用法
  • 容器服务kubernetes弹性伸缩高级用法
  • 小程序开发之路(一)
  • 正则表达式-基础知识Review
  • 资深实践篇 | 基于Kubernetes 1.61的Kubernetes Scheduler 调度详解 ...
  • ​​快速排序(四)——挖坑法,前后指针法与非递归
  • #define,static,const,三种常量的区别
  • #pragma once
  • (9)目标检测_SSD的原理
  • (Java岗)秋招打卡!一本学历拿下美团、阿里、快手、米哈游offer
  • (ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY)讲解
  • (待修改)PyG安装步骤
  • (二)Eureka服务搭建,服务注册,服务发现
  • (附源码)springboot 基于HTML5的个人网页的网站设计与实现 毕业设计 031623
  • (附源码)springboot优课在线教学系统 毕业设计 081251
  • (附源码)ssm智慧社区管理系统 毕业设计 101635
  • (附源码)计算机毕业设计大学生兼职系统
  • (十三)Java springcloud B2B2C o2o多用户商城 springcloud架构 - SSO单点登录之OAuth2.0 根据token获取用户信息(4)...
  • (四)汇编语言——简单程序
  • (一)ClickHouse 中的 `MaterializedMySQL` 数据库引擎的使用方法、设置、特性和限制。
  • (译)2019年前端性能优化清单 — 下篇
  • (转)chrome浏览器收藏夹(书签)的导出与导入
  • (转)为C# Windows服务添加安装程序
  • .net中我喜欢的两种验证码
  • .secret勒索病毒数据恢复|金蝶、用友、管家婆、OA、速达、ERP等软件数据库恢复
  • /proc/stat文件详解(翻译)