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)相关推荐

  1. 2021字节跳动校招秋招算法面试真题解题报告--leetcode19 删除链表的倒数第 n 个结点,内含7种语言答案

    2021字节跳动校招秋招算法面试真题解题报告--leetcode19 删除链表的倒数第 n 个结点,内含7种语言答案 1.题目描述 给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点. ...

  2. 代码随想录Day04 | LeetCode24. 两两交换链表中的节点、LeetCode19. 删除链表的倒数第N个节点、LeetCode160. 链表相交、LeetCode142. 环形链表Ⅱ

    LeetCode24. 两两交换链表中的节点 力扣题目链接 给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点.你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换). 示例 ...

  3. LeetCode19删除链表的倒数第N个节点20有效的括号

    维护不易,还请点赞支持,微信搜索bigsai 回复进群一起打卡. 19删除链表的倒数第N个节点 给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点. 示例: 给定一个链表: 1-> ...

  4. LeetCode-19 删除链表的倒数第N个节点

    文章目录 题目描述 我的解法 反思 优化 再次反思 再次优化 总结 Github 题目描述 给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点. 示例: 给定一个链表: 1->2- ...

  5. leetcode19. 删除链表的倒数第N个节点

    给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点. 示例: 给定一个链表: 1->2->3->4->5, 和 n = 2. 当删除了倒数第二个节点后,链表变为 ...

  6. [Swift]LeetCode19. 删除链表的倒数第N个节点 | Remove Nth Node From End of List

    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★ ➤微信公众号:山青咏芝(shanqingyongzhi) ➤博客园地址:山青咏芝(https://www.cnblog ...

  7. Leetcode--19. 删除链表的倒数第N个节点

    给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点. 示例: 给定一个链表: 1->2->3->4->5, 和 n = 2. 当删除了倒数第二个节点后,链表变为 ...

  8. C语言通过链表指针删除链表节点的算法(附完整源码)

    C语言通过链表指针删除链表节点的算法 C语言通过链表指针删除链表节点的算法完整源码(定义,实现,main函数测试) C语言通过链表指针删除链表节点的算法完整源码(定义,实现,main函数测试) #in ...

  9. 链表之删除链表中间节点

    题目: 链表之删除链表中间节点 思路: 方法1: 我们先得到链表的长度,如果是奇数的话加一除以2,如果是偶数直接除以二,  得到的长度,然后从头结点开始遍历得到的长度前一个节点,然后把它删除   方法 ...

最新文章

  1. 奥比中光Astra深度传感器工作原理
  2. pwm波如何控制电机代码_柴油发电机机组的控制器该如何操作
  3. Centos7 下部署PPTP
  4. 助力中小企业级连云端,促进工业互联网平台蓬勃发展,全套解决方案。附:技术产品
  5. Java并发教程–线程安全设计
  6. 原码一位乘法器设计_数字IC校招基础知识点复习(七)——超前进位加法器、Wallace树、Booth乘法器...
  7. Qt工作笔记-主界面传输数据到附属界面(通过信号与槽非构造函数)
  8. Top命令找出CPU占用较高的Java线程信息
  9. MYSQL 5.7 INNODB 表空间
  10. PTA5-1 最大子列和问题
  11. 不用写代码也能学会采集海量企业电话及邮箱数据
  12. 外螺纹对照表_紧固件螺纹直径与螺距对照表
  13. 使用WebSockets搭建多人在线聊天室
  14. Windows11企业版22000.1精简版(附下载链接)
  15. 老师用计算机教我们画画拼音,《汉语拼音13 ang eng ing ong》第三课时教学设计...
  16. 找回HDFS corrupted文件残留数据
  17. python快递费用计算_Python实现快递查询
  18. IntelliJ IDEA 快捷键及模板Templates设置
  19. 植发搞笑图片_植发失败实例:头发没长出来还更秃了?詹姆斯也没能幸免,可怕...
  20. 云服务器是不是虚拟主机,云服务器不是虚拟主机吗

热门文章

  1. neo4j图数据库基本概念
  2. 24点游戏---java编写
  3. SpringBoot启动流程简要
  4. Business English-Unit 4 Memos -A
  5. html的style不起作用,css样式不起作用是什么原因?
  6. 滴滴一下,小程序专车来了
  7. 【C库函数】 strstr函数详解
  8. 6.2、C++的内联函数、函数重载、局部变量和全局变量
  9. UVA 10881 Piotr‘s Ants
  10. 一个普通的小活动让超市回头客源源不断?方案简单到爆