19. Remove Nth Node From End of List[M]删除链表的倒数第N个节点
题目
Given a linked list, remove the n-th node from the end of list and return its head.
Example:*
Given linked list : 1->2->3->4->5, and n = 2.
After removing the second node from the end, the linked list becomes 1->2->3->5.
Note:
Given n will always be valid.
Follow up:
Could you do this in one pass?
思路
思路一:Two Pass
首先定义一个辅助节点auxList,使它的下一个节点指向链表head,用来简化边界判断的条件,例如一个链表只有一个节点,删除了头节点。第一次遍历(one pass),得到链表的长度L;第二次遍历(two pass)设置一个指针指向辅助节点auxList,并开始删除节点,一直到指定的n停止,此时到达第\(L-n\)个节点;将第\(L-n\)与第\(L-n+2\)个节点重新连接,于是就删除了第\(L-n+1\)个节点(因为人为增加一个节点)。
思路二:One Pass
题目让我们思考,如何通过一次循环来实现对链表倒数N个节点的删除。
- 双指针法
可以利用双指针法来解决倒数的问题:- 第一个指针快一点,用来控制循环的次数
- 第二个指针慢一点,用于遍历
两个指针都是指向链表,也就是两个指针对应两个一样的链表。要想一次遍历实现对第\(L-n\)个节点的删除,首先用第一个指针“跑”完n次,此时第二个指针开始“跑”,并且以第一个指针从第n个节点跑到第L-1个节点为循环次数,此时相当于第二个链表跑了\(L-n\)个数,这样就找到了链表中倒数第n个数。
- 递归
这种涉及单链表的插入与删除都可以考虑递归,因为插入和删除都要涉及到上一层节点的操作。将最后一个节点设置为第一层,逐层f返回,当返回到第n+1层开始删除。
Tips
单链表

单链表示意图,表头为空,表头的后继节点是"1"
**链表的搜索**
查找链表L中第一个关键字为k的元素,并返回指向该元素的指针。如果链表中没有关键字为k的对象,则返回空(NIL)
```cpp
//List-Search(L,k)
x = L.head;
while x != NIL and x.key != k //NIL为空
x = x.next
return x
```
**链表的插入**

图:链表的插入
链表的删除

图:链表的删除
---
#C++
* 思路一
```cpp
ListNode* removeNthFromEnd(ListNode* head, int n) {
ListNode* auxList = new ListNode(0);
auxList->next = head;
int length = 0;
ListNode* pass = head;
while(pass != NULL){
length ++;
pass = pass->next;
}
length -= n;
pass = auxList;
while(length > 0){
length --;
pass = pass->next;
}
pass->next = pass->next->next;
return auxList->next; //这里返回next是因为auxList的next才是原来的链表
}
* 思路二(1)
```cpp
ListNode* removeNthFromEnd(ListNode* head, int n) {
ListNode* auxList = new ListNode(0);
auxList->next = head;
ListNode* point1 = auxList;
ListNode* point2 = auxList;
for(int i = 1; i <= n + 1;i++)
point1 = point1->next;
while(point1 != NULL){
point1 = point1->next;
point2 = point2->next;
}
point2->next = point2->next->next;
return auxList->next;
}
- 思路二(2)
ListNode* removeNthFromEnd(ListNode* head, int n) {
ListNode* auxList = new ListNode(0);
auxList->next = head;
remove(auxList, n);
return auxList->next;
}
int remove(ListNode* head, int n){
if(head->next == NULL)
return 1;
int levels = remove(head->next, n) + 1;
if(levels == n+1)
head->next = head->next->next;
return levels;
}
Python
参考
[1] 算法导论第10章10.2,p131
[2] http://www.cnblogs.com/skywang12345/p/3561803.html
19. Remove Nth Node From End of List[M]删除链表的倒数第N个节点的更多相关文章
- 19. Remove Nth Node From End of List C++删除链表的倒数第N个节点
https://leetcode.com/problems/remove-nth-node-from-end-of-list/ 使用双指针法,可以仅遍历一次完成节点的定位 /** * Definiti ...
- LeetCode 19. Remove Nth Node From End of List(删除链表中倒数第N个节点)
题意:删除链表中倒数第N个节点. 法一:递归.每次统计当前链表长度,如果等于N,则return head -> next,即删除倒数第N个节点:否则的话,问题转化为子问题“对head->n ...
- LeetCode第[19]题(Java):Remove Nth Node From End of List(删除链表的倒数第N个节点)
题目:删除链表的倒数第N个节点 难度:Medium 题目内容: Given a linked list, remove the n-th node from the end of list and r ...
- 25.Remove Nth Node From End of List(删除链表的倒数第n个节点)
Level: Medium 题目描述: Given a linked list, remove the n-th node from the end of list and return its ...
- 力扣—Remove Nth Node From End of List(删除链表的倒数第N个节点) python实现
题目描述: 中文: 给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点. 示例: 给定一个链表: 1->2->3->4->5, 和 n = 2. 当删除了倒数第二 ...
- [LeetCode] 19. Remove Nth Node From End of List 移除链表倒数第N个节点
Given a linked list, remove the nth node from the end of list and return its head. For example, Give ...
- [Leetcode] remove nth node from the end of list 删除链表倒数第n各节点
Given a linked list, remove the n th node from the end of list and return its head. For example, Giv ...
- 61. Rotate List(M);19. Remove Nth Node From End of List(M)
61. Rotate List(M) Given a list, rotate the list to the right by k places, where k is non-negative. ...
- 《LeetBook》leetcode题解(19):Remove Nth Node From End of List[E]——双指针解决链表倒数问题
我现在在做一个叫<leetbook>的开源书项目,把解题思路都同步更新到github上了,需要的同学可以去看看 这个是书的地址: https://hk029.gitbooks.io/lee ...
随机推荐
- 原生js做h5小游戏之打砖块
前言 首先,先说明一下做这个系列的目的:其实主要源于博主希望熟练使用 canvas 的相关 api ,同时对小游戏的实现逻辑比较感兴趣,所以希望通过这一系列的小游戏来提升自身编程能力:关于 es6 语 ...
- 在webstrorm中配置好es6 babel【更新:在webstorm中配置.vue和.vue文件中支持es6】
第一步:全局安装babel-cli npm install -g babel-cli 第二步,新建一个空项目,在 WebStorm 中的当前项目中打开 Terminal,进入项目的根目录下, 安装 E ...
- dataAdapter
public static class DataAdapter { /// <summary> /// DataRow转换成Hash对象 /// </summary> /// ...
- RFID 知识的学习
* 部分资料来自我们博士的PPT,部分来自网络和他人的论文. * 我们使用的教材是清华大学出版社出版的<智能卡技术(第四版)——IC卡.RFID标签与物联网(清华大学计算机系列教材)>(王 ...
- Java中的自动转换
特点: 1. 系统自动完成的,不需要程序员手动修改代码 2.将 取值范围小的类型 自动提升为 取值范围大的类型 注意: 整数类型直接写会默认为int 小数类型直接写默认为double 类型的范围大小 ...
- webstorm主题网址
http://www.phpstorm-themes.com/ http://www.riaway.com/theme.php
- java 常用API
package com.orcal.demc01; public class Regex { public static void main(String[] args) { // TODO Auto ...
- 【udacity】机器学习-回归
Evernote Export 1.什么是回归? regression 在监督学习中,包括了输入和输出的样本,在此基础上,我们能够通过新的输入来表示结果,映射到输出 输出包含了离散输出和连续输出 2. ...
- 容器化haproxy+keepalived
# 拉取haproxy镜像 docker pull haproxy:1.7.8-alpine mkdir /etc/haproxy cat >/etc/haproxy/haproxy.cfg&l ...
- THUWC2019 划水记
Day -2 在学校呆了inf天之后终于回家了! Day 0 在家无(tui)所(fei)事(mo)事(yu),顺便被拉出去剪了个头发,想写写thusc2017的题也写不动,一直在网上冲浪,到处乱翻以 ...