【LeetCode题解】19_删除链表的倒数第N个节点(Remove-Nth-Node-From-End-of-List)
更多 LeetCode 题解笔记可以访问我的 github。
描述
给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点。
示例:
给定一个链表: 1->2->3->4->5, 和 n = 2.
当删除了倒数第二个节点后,链表变为 1->2->3->5.
说明:
给定的 n 保证是有效的。
进阶:
你能尝试使用一趟扫描实现吗?
解法:双指针
思路
求解这道问题等价于寻找倒数的第 \(N+1\) 个节点,然后将该节点的 next 指针执行倒数第 \(N - 1\) 个节点。 为了找到倒数第 \(N + 1\) 个节点,我们必须借助一把长度可变尺子——双指针。
具体的做法如下:
第 0 步(准备阶段):为了方便对头节点进行删除,统一删除节点的操作,我们创建一个虚拟的头节点,接着,再创建两个指针(p1 和 p2)指向虚拟头节点;

第一步:将 p2 指针移动 \(N\) 步,此时,p2 指针位于第 \(N\) 个节点,两个指针之间的长度为 \(N + 1\),这就是我们的尺子;

第二步:移动我们的尺子(同时移动两个指针),直到 p2 指针到达链表的尾部,此时,p1 指针的 next 引用所指向的正是倒数第 \(N\) 个节点;

最后,我们只需要操作 p1 指针的 next 引用,使得它指向倒数第 \(N - 1\) 个节点即可实现对于倒数第 \(N\) 个节点的删除操作。
Java 实现
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public ListNode removeNthFromEnd(ListNode head, int n) {
if (head == null || head.next == null) {
return null;
}
// 创建一个虚拟头节点
ListNode dummy = new ListNode(-1);
dummy.next = head;
// 创建两个指针,并将p2指针移动n步
ListNode p1 = dummy, p2 = dummy;
for (int i = 0; i < n; ++i) {
p2 = p2.next;
}
// 移动两个指针直到p2处于链表尾部
while (p2.next != null) {
p1 = p1.next;
p2 = p2.next;
}
// 删除第n个节点
// ListNode nthNode = p1.next;
p1.next = p1.next.next;
// nthNode.next = null;
return dummy.next;
}
}
// Runtime: 6 ms
// Your runtime beats 100.00 % of java submissions.
Python 实现
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution:
def removeNthFromEnd(self, head, n):
"""
:type head: ListNode
:type n: int
:rtype: ListNode
"""
if not head or not head.next:
return None
# 创建虚拟头节点
dummy = ListNode(-1)
dummy.next = head
# 创建两个指针,并将指针p2移动n步
p1, p2 = dummy, dummy
for i in range(n):
p2 = p2.next
# 同时移动两个指针,直到p2位于链表的尾部
while p2.next:
p1, p2 = p1.next, p2.next
# 删除倒数第n个节点
p1.next = p1.next.next
return dummy.next
# Runtime: 36 ms
# Your runtime beats 100.00 % of python3 submissions.
复杂度分析
- 时间复杂度:\(O(n)\),其中 \(n\) 表示链表的长度。首先需要 \(N\) 次操作将
p2指针移动到第 \(N\) 个节点;接着,需要 \(2 \times (n-N)\) 次操作将p2指针移动到链表尾部,同时将p1移动到倒数第 \(N + 1\) 个节点。因此,总的时间复杂度是 \(O(n)\) 的。 - 空间复杂度:\(O(1)\)
【LeetCode题解】19_删除链表的倒数第N个节点(Remove-Nth-Node-From-End-of-List)的更多相关文章
- LeetCode 19:删除链表的倒数第N个节点 Remove Nth Node From End of List
给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点. Given a linked list, remove the n-th node from the end of list and ...
- [Swift]LeetCode19. 删除链表的倒数第N个节点 | Remove Nth Node From End of List
Given a linked list, remove the n-th node from the end of list and return its head. Example: Given l ...
- [LeetCode题解]19. 删除链表的倒数第N个节点 | 双指针 + 一次遍历
解题思路 双指针:第一个指针先走 n 步,然后两个指针同时走. 这里要注意当链表长度<=n,要删除头节点. 代码 /** * Definition for singly-linked list. ...
- 【leetcode】19. 删除链表的倒数第N个节点
描述 给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点. 示例 给定一个链表: 1->2->3->4->5, 和 n = 2. 当删除了倒数第二个节点后,链表变 ...
- leetcode题目19.删除链表的倒数第N个节点(中等)
题目描述: 给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点. 示例: 给定一个链表: 1->2->3->4->5, 和 n = 2. 当删除了倒数第二个节点后 ...
- 【LeetCode 19】删除链表的倒数第N个节点
题目链接 [题解] 经典的一道题. 让p1指向链表的第一个元素. 让p2指向链表的第二个元素. 然后让他们俩同时往后移动. 直到p2到达链表的尾巴. 这时p1和p2之间总是隔了n-1个元素. 所以p1 ...
- 领扣(LeetCode)删除链表的倒数第N个节点 个人题解
给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点. 示例: 给定一个链表: 1->2->3->4->5, 和 n = 2. 当删除了倒数第二个节点后,链表变为 ...
- 【LeetCode】Remove Nth Node From End of List(删除链表的倒数第N个节点)
这道题是LeetCode里的第19道题. 题目要求: 给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点. 示例: 给定一个链表: 1->2->3->4->5, ...
- 【LeetCode】删除链表的倒数第N个节点【双指针法】
给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点. 示例: 给定一个链表: 1->2->3->4->5, 和 n = 2. 当删除了倒数第二个节点后,链表变为 ...
随机推荐
- AngularJS 杂项知识点
1.要用ngChange要同时使用ngModel,下拉选择获取当前选中值. 2.打包代替动态加载(js文件) requirejs真正的价值在于模块化,不是动态加载,angularjs本身有模块化机制, ...
- JS产生徐特尔图表
徐特尔图表是一个小游戏,在5*5的格子上,无序的写着1~25这25个数子,然后再找出来.其实在JS中也就是将25个数进行随机产生然后放到一个表格中.主要分为两部分,一是随机数的产生,还有一部分就是表格 ...
- 输入URL地址到最终页面渲染完成,发生了什么事
1. 域名DNS解析 - 浏览器DNS缓存 - 系统DNS缓存 - 路由器DNS缓存 - 网络运营商DNS缓存 - 递归搜索...... 2. TCP连接: TCP三次握手 - 第一次握手,由浏览器发 ...
- ASP.NET Core WebApi 项目部署到 IIS 服务器的总结
Point: - ASP.NET Core WebApi 项目 - 发布到 IIS 服务器 1. 选择 File System 2. 输入要发布到的路径 # 其它默认,直接发布 3. 打开 IIS,添 ...
- Liferay开发实战(1):入门
网址: https://www.liferay.com/zh/ 文档: https://dev.liferay.com/develop 入门文章网上很多,中文的较少,存在版本太旧的问题,也缺少一步一步 ...
- [Leetcode]495.提莫攻击
题目: 在<英雄联盟>的世界中,有一个叫 "提莫" 的英雄,他的攻击可以让敌方英雄艾希(编者注:寒冰射手)进入中毒状态.现在,给出提莫对艾希的攻击时间序列和提莫攻击的中 ...
- 不能将 CHECK_POLICY 和 CHECK_EXPIRATION 选项设为 OFF (关)
数据库用户信息死活无法修改..老是出现错误当 MUST_CHANGE 为 ON (开)时,不能将 CHECK_POLICY 和 CHECK_EXPIRATION 选项设为 OFF (关). (Micr ...
- cookie、session的区别
相信你肯定经常听说cookie和Session,那你有没有好好了解这两个的区别呢?其实,不整理之前,我也是一脸懵. 为什么需要cookie和session呢?---因为Http是无状态的,web开发中 ...
- Docker三剑客之Docker Machine
一.什么是Docker Machine Docker Machine 是Docker官方编排项目之一,使用go语言编写的,使用不同引擎在多种平台上快速的安装Docker环境,开源地址:https:// ...
- 课程二(Improving Deep Neural Networks: Hyperparameter tuning, Regularization and Optimization),第二周(Optimization algorithms) —— 2.Programming assignments:Optimization
Optimization Welcome to the optimization's programming assignment of the hyper-parameters tuning spe ...