【链表】leetcode19.删除链表的倒数第N个节点(C/C++/Java/Js)
leetcode19.删除链表的倒数第N个节点
- 1 题目
- 2 思路
- 3 代码
- 3.1 C++版本
- 3.2 C版本
- 3.3 Java版本
- 3.4 JavaScript版本
- 4 总结
1 题目
题源链接
给你一个链表,删除链表的倒数第 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
2 思路
双指针的经典应用,如果要删除倒数第n个节点,让fast移动n步,然后让fast和slow同时移动,直到fast指向链表末尾。删掉slow所指向的节点就可以了。
快慢指针法:
定义fast指针和slow指针,还是和以前一样,添加虚拟头结点,链表:听说添加虚拟头结点会更方便噢
接下来举一个例子,删除倒数第n个结点,n举例为3:
3 代码
3.1 C++版本
/*** 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* slow = dummyHead;ListNode* fast = dummyHead;while(n-- && fast != NULL) {fast = fast->next;}fast = fast->next; // fast再提前走一步,因为需要让slow指向删除节点的上一个节点while (fast != NULL) {fast = fast->next;slow = slow->next;}slow->next = slow->next->next; // ListNode *tmp = slow->next; C++释放内存的逻辑// slow->next = tmp->next;// delete nth;return dummyHead->next;}
};
3.2 C版本
/*** Definition for singly-linked list.* struct ListNode {* int val;* struct ListNode *next;* };*/
struct ListNode* removeNthFromEnd(struct ListNode* head, int n){//快慢指针法//定义虚拟头结点struct ListNode *fakeHead = (struct ListNode*)malloc(sizeof(struct ListNode));fakeHead->next = head;struct ListNode *fast = head, *slow = fakeHead; //定义快慢指针while (n--) fast = fast->next;while (fast) {fast = fast->next;slow = slow->next;//遍历到fast为空时,slow实际是指向待删结点前一个结点}struct ListNode * temp = slow->next; //temp指向待删结点slow->next = temp->next;free(temp);return fakeHead->next;
}
3.3 Java版本
public ListNode removeNthFromEnd(ListNode head, int n){ListNode dummyNode = new ListNode(0);dummyNode.next = head;ListNode fastIndex = dummyNode;ListNode slowIndex = dummyNode;//只要快慢指针相差 n 个结点即可for (int i = 0; i < n ; i++){fastIndex = fastIndex.next;}while (fastIndex.next != null){fastIndex = fastIndex.next;slowIndex = slowIndex.next;}//此时 slowIndex 的位置就是待删除元素的前一个位置。//具体情况可自己画一个链表长度为 3 的图来模拟代码来理解slowIndex.next = slowIndex.next.next;return dummyNode.next;
}
3.4 JavaScript版本
/*** @param {ListNode} head* @param {number} n* @return {ListNode}*/
var removeNthFromEnd = function(head, n) {let ret = new ListNode(0, head),slow = fast = ret;while(n--) fast = fast.next;while (fast.next !== null) {fast = fast.next; slow = slow.next};slow.next = slow.next.next;return ret.next;
};
4 总结
双指针的经典应用,如果要删除倒数第n个节点,让fast移动n步,然后让fast和slow同时移动,直到fast指向链表末尾。删掉slow所指向的节点就可以了。
这类的题,做会一道之后要学会类比运用,真正掌握这个思想。
By–Suki 2023/1/12
【链表】leetcode19.删除链表的倒数第N个节点(C/C++/Java/Js)相关推荐
- 2021字节跳动校招秋招算法面试真题解题报告--leetcode19 删除链表的倒数第 n 个结点,内含7种语言答案
2021字节跳动校招秋招算法面试真题解题报告--leetcode19 删除链表的倒数第 n 个结点,内含7种语言答案 1.题目描述 给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点. ...
- 代码随想录Day04 | LeetCode24. 两两交换链表中的节点、LeetCode19. 删除链表的倒数第N个节点、LeetCode160. 链表相交、LeetCode142. 环形链表Ⅱ
LeetCode24. 两两交换链表中的节点 力扣题目链接 给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点.你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换). 示例 ...
- LeetCode19删除链表的倒数第N个节点20有效的括号
维护不易,还请点赞支持,微信搜索bigsai 回复进群一起打卡. 19删除链表的倒数第N个节点 给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点. 示例: 给定一个链表: 1-> ...
- LeetCode-19 删除链表的倒数第N个节点
文章目录 题目描述 我的解法 反思 优化 再次反思 再次优化 总结 Github 题目描述 给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点. 示例: 给定一个链表: 1->2- ...
- leetcode19. 删除链表的倒数第N个节点
给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点. 示例: 给定一个链表: 1->2->3->4->5, 和 n = 2. 当删除了倒数第二个节点后,链表变为 ...
- [Swift]LeetCode19. 删除链表的倒数第N个节点 | Remove Nth Node From End of List
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★ ➤微信公众号:山青咏芝(shanqingyongzhi) ➤博客园地址:山青咏芝(https://www.cnblog ...
- Leetcode--19. 删除链表的倒数第N个节点
给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点. 示例: 给定一个链表: 1->2->3->4->5, 和 n = 2. 当删除了倒数第二个节点后,链表变为 ...
- C语言通过链表指针删除链表节点的算法(附完整源码)
C语言通过链表指针删除链表节点的算法 C语言通过链表指针删除链表节点的算法完整源码(定义,实现,main函数测试) C语言通过链表指针删除链表节点的算法完整源码(定义,实现,main函数测试) #in ...
- 链表之删除链表中间节点
题目: 链表之删除链表中间节点 思路: 方法1: 我们先得到链表的长度,如果是奇数的话加一除以2,如果是偶数直接除以二, 得到的长度,然后从头结点开始遍历得到的长度前一个节点,然后把它删除 方法 ...
最新文章
- 奥比中光Astra深度传感器工作原理
- pwm波如何控制电机代码_柴油发电机机组的控制器该如何操作
- Centos7 下部署PPTP
- 助力中小企业级连云端,促进工业互联网平台蓬勃发展,全套解决方案。附:技术产品
- Java并发教程–线程安全设计
- 原码一位乘法器设计_数字IC校招基础知识点复习(七)——超前进位加法器、Wallace树、Booth乘法器...
- Qt工作笔记-主界面传输数据到附属界面(通过信号与槽非构造函数)
- Top命令找出CPU占用较高的Java线程信息
- MYSQL 5.7 INNODB 表空间
- PTA5-1 最大子列和问题
- 不用写代码也能学会采集海量企业电话及邮箱数据
- 外螺纹对照表_紧固件螺纹直径与螺距对照表
- 使用WebSockets搭建多人在线聊天室
- Windows11企业版22000.1精简版(附下载链接)
- 老师用计算机教我们画画拼音,《汉语拼音13 ang eng ing ong》第三课时教学设计...
- 找回HDFS corrupted文件残留数据
- python快递费用计算_Python实现快递查询
- IntelliJ IDEA 快捷键及模板Templates设置
- 植发搞笑图片_植发失败实例:头发没长出来还更秃了?詹姆斯也没能幸免,可怕...
- 云服务器是不是虚拟主机,云服务器不是虚拟主机吗