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

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

/*** 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* dummy = new ListNode(-1);dummy->next = head;ListNode *p = dummy , *q = dummy;while(n--)  p = p->next;while(p->next){p = p->next;q = q->next;}q->next = q->next->next;return dummy->next;}
};

关键

  • 创建一个虚拟节点dummy,指向head
  • 采用双指针p,q
  • p 比 q领先 n 个位置
  • p 指向最后一个节点 时, q 指向 要删除节点 的直接前驱

leetcode 237. 删除链表中的节点

/*** Definition for singly-linked list.* struct ListNode {*     int val;*     ListNode *next;*     ListNode(int x) : val(x), next(NULL) {}* };*/
class Solution {
public:void deleteNode(ListNode* node) {node->val = node->next->val;node->next = node->next->next;}
};
/*** Definition for singly-linked list.* struct ListNode {*     int val;*     ListNode *next;*     ListNode(int x) : val(x), next(NULL) {}* };*/
class Solution {
public:void deleteNode(ListNode* node) {*node = *(node->next);}
};

leetcode 83. 删除排序链表中的重复元素


/*** 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* deleteDuplicates(ListNode* head) {if(! head)return head;ListNode* p = head;while(p->next){if(p->val == p->next->val)p->next = p->next->next;else p = p->next;}return head;}
};

leetcode 61. 旋转链表

/*** 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* rotateRight(ListNode* head, int k) {if(!head || !head->next || !k)return head;ListNode* p = head;int n = 1;while(p->next){p = p->next;n ++;}k %= n;if(!k) return head;ListNode* dummy = new ListNode(-1);dummy->next = head;p = dummy;ListNode* q = dummy;while(k--)  p = p->next;while(p->next){p = p->next;q = q->next;}dummy->next = q->next;p->next = head;q->next = NULL;return dummy->next;}
};

注意

  • 后三条 修改指针语句 有bug
  • 故须 在程序 前面 处理 特殊情况
    1 链表仅有一个节点时
    2 k % n = 0 时
  • 核心思想
  1. 旋转k次,即将链表的 后k个节点 作为一个 整体 放在表头
  2. 故使用双指针找到 后k个节点
/*** 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* rotateRight(ListNode* head, int k) {if(!head)return head;ListNode* p = head;int n = 1;while(p->next){p = p->next;n ++;}k %= n;ListNode* dummy = new ListNode(-1);dummy->next = head;p = dummy;ListNode* q = dummy;while(k--)  p = p->next;while(p->next){p = p->next;q = q->next;}p->next = head;head = q->next;q->next = NULL;return head;}
};

leetcode 24. 两两交换链表中的节点

/*** 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* swapPairs(ListNode* head) {if(!head)return head;ListNode* dummy = new ListNode(-1);dummy->next = head;ListNode* p = dummy;ListNode* q = head;while(q && q->next){p->next = q->next;q->next = q->next->next;p->next->next = q;p = q;q = q->next;}return dummy->next;}
};
  • 情况① : 表为空,直接返回
  • 情况② : 表中元素数目为奇数,最后一个不做处理,故while循环条件时q和q的后继不为空
  • 情况③ : 一般情况
    在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/161871.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Linux系统化学习】开发工具——gdb(调试器)

个人主页点击直达:小白不是程序媛 Linux专栏:Linux系统化学习 个人仓库:Gitee 目录 前言: gdb版本检查和安装 Debug和Release gdb的使用 其他指令 前言: 前几篇文章分别介绍了在Linux下的代码编辑器、编译器。…

python 深度学习 解决遇到的报错问题9

本篇继python 深度学习 解决遇到的报错问题8-CSDN博客 目录 一、can only concatenate str (not "int") to str 二、cant convert np.ndarray of type numpy.object_. The only supported types are: float64, float32, float16, complex64, complex128, int64, in…

MATLAB - Gazebo 联合仿真 —— 使用 UR10 机械臂检测和采摘水果

系列文章目录 文章目录 系列文章目录前言一、设置 Gazebo 仿真环境二、在 Gazebo 中模拟和控制机器人2.1 概述2.2 任务调度器2.3 感知和目标生成系统2.4 运动规划2.5 机械臂和关节控制系统 三、分配用于控制机器人的参数3.1 定义机器人模型和运动规划参数,3.2 定义机…

历法、节日、节气

目录 一,阳历、阴历、公历、农历 1,阳历、阴历 2,公历,农历 二,双历合并 1,组成要素 2,一年 3,一月 4,一日 三,闰法则 1,闰秒 2&#…

分布式单元化

一 分布式单元化 1.1 两地三中心 顾名思义,两地指的是两个城市:同城,异地。三中心指的是三个数据中心:生产中心、同城容灾中心、异地容灾中心。 在同一个城市或者临近的城市建设两个相同的系统,双中心具备相当的业…

【漏洞复现】Webmin 远程命令执行(CVE-2019-15107)

感谢互联网提供分享知识与智慧,在法治的社会里,请遵守有关法律法规 文章目录 1.1、漏洞描述1.2、漏洞等级1.3、影响版本1.4、漏洞复现1、基础环境2、漏洞验证 1.5、深度利用1、反弹Shell 1.6、修复建议1.7、参考链接 说明内容漏洞编号CVE-2019-15107漏洞…

如何发布自己的golang库

如何发布自己的golang库 1、在 github/gitee 上创建一个 public 仓库,仓库名与 go 库名一致,然后将该仓库 clone 到本地。 本文这里使用 gitee。 $ git clone https://gitee.com/zsx242030/goutil.git2、进入项目文件夹,进行初始化。 $ go…

数字人IP为何成家电品牌年轻化营销黑马?

伴随着数字人概念的出现,家电品牌逐渐通过3D虚拟数字人定制,让数字人成为内容、变现一体的IP,形成一定影响力的品牌效应,利用长线内容沉淀粉丝,使品牌实现年轻化营销。 *图片源于网络 如近日在海尔智家旗下品牌发布会上…

每天五分钟计算机视觉:池化层的反向传播

本文重点 卷积神经网络(Convolutional Neural Network,CNN)作为一种强大的深度学习模型,在计算机视觉任务中取得了巨大成功。其中,池化层(Pooling Layer)在卷积层之后起到了信息压缩和特征提取的作用。然而,池化层的反向传播一直以来都是一个相对复杂和深奥的问题。本…

npm ERR! code ELIFECYCLE

问题: 一个老项目,现在想运行下,打不开了 npm install 也出错 尝试1 、使用cnpm npm install -g cnpm --registryhttps://registry.npm.taobao.org cnpm install 还是不行 尝试2、 package.json 文件,去掉 那个插件 chorm…

Unity地面交互效果——3、曲面细分基础知识

大家好,我是阿赵。   之前介绍了使用动态法线贴图混合的方式模拟轨迹的凹凸感,这次来讲一下更真实的凹凸感制作。不过在说这个内容之前,这一篇先要介绍一下曲面细分着色器(Tessellation Shader)的用法。 一、为什么要做曲面细分 之前通过法…

【PWN · heap | unlink】hitcon2014_stkof

初学,通过一道题初步掌握unlink。不教学unlink的具体过程,仅是一篇wp记录笔记 前言 教学和具体过程可以看这个大佬的博客: buuctf pwn hitcon2014_stkof 初识unlink_buuctf hitcon2014_stkof-CSDN博客 一、题目 fill函数可读大量字符&#…