题目

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

单链表

![](https://i.loli.net/2019/05/20/5ce25ec0d432a91619.jpg)
单链表示意图,表头为空,表头的后继节点是"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
```
**链表的插入**
![](https://i.loli.net/2019/05/20/5ce2611b14b8675624.jpg)
图:链表的插入

链表的删除

![](https://i.loli.net/2019/05/20/5ce26180b2ff342106.jpg)
图:链表的删除
---
#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个节点的更多相关文章

  1. 19. Remove Nth Node From End of List C++删除链表的倒数第N个节点

    https://leetcode.com/problems/remove-nth-node-from-end-of-list/ 使用双指针法,可以仅遍历一次完成节点的定位 /** * Definiti ...

  2. LeetCode 19. Remove Nth Node From End of List(删除链表中倒数第N个节点)

    题意:删除链表中倒数第N个节点. 法一:递归.每次统计当前链表长度,如果等于N,则return head -> next,即删除倒数第N个节点:否则的话,问题转化为子问题“对head->n ...

  3. 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 ...

  4. 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 ...

  5. 力扣—Remove Nth Node From End of List(删除链表的倒数第N个节点) python实现

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

  6. [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 ...

  7. [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 ...

  8. 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. ...

  9. 《LeetBook》leetcode题解(19):Remove Nth Node From End of List[E]——双指针解决链表倒数问题

    我现在在做一个叫<leetbook>的开源书项目,把解题思路都同步更新到github上了,需要的同学可以去看看 这个是书的地址: https://hk029.gitbooks.io/lee ...

随机推荐

  1. seo在前端网页制作的应用

    学习了慕客网上的“SEO在网页制作中的应用‘’,下面来进行小小的学习总结,顺便梳理下知识.所谓学而不思则罔思而不学则殆.下面开始正文. 一.搜索引擎的工作原理 搜索引擎的基本工作原理包括如下三个过程: ...

  2. Android中图片旋转

    Activity_main.xml文件配置 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/androi ...

  3. root密码忘记怎么办?

    忘记root密码:按 e进入内核在按e,后面加1 .按b启动 进入命令行输入passwd,设置新的密码后exit退出即可

  4. Cython入门.VS.C++

    原文链接:http://blog.csdn.net/gzlaiyonghao/article/details/4561611 作者:perrygeo 译者:赖勇浩(http://laiyonghao. ...

  5. 【转】Oracle 集群】ORACLE DATABASE 11G RAC 知识图文详细教程之ORACLE集群概念和原理(二)

      阅读目录 目录 Oracle集群概念和原理 RAC概述 RAC 集成集群件管理 RAC 的体系结构 RAC 的结构组成和机制 RAC 后台进程 RAC 共享存储 RAC 数据库和单实例数据库的区别 ...

  6. luogu p3918[国家集训队]特技飞行 贪心

    开始没看出来是贪心,一度以为是动态规划,还是太弱了呀-.. 不难分析出,两个相同的飞行动作之间夹一个相同的动作是多余的,所以就贪心一下,按Ci从大到小排序,依次加到左右两端点,知道加不了为止. 代码: ...

  7. 路飞学城Python-Day180

    部署作业 [pythonanywhere]

  8. Mysql插入语句.txt

    INSERT INTO 目标表 SELECT * FROM 来源表;比如要将 articles 表插入到 newArticles 表中,则是:INSERT INTO newArticles SELEC ...

  9. 主题:实战WebService II: SOAP篇(基于php)

    概述(SOAP和XML-PRC比较) 在Web服务发展的初期,XML格式化消息的第一个主要用途是,应用于XML-RPC协议,其中RPC代表远程过程调用.在XML远程过程调用 (XML-RPC)中,客户 ...

  10. 微信公众号开发之获取微信用户的openID

    (注:openID同一用户同一应用唯一,UnionID同一用户不同应用唯一.不同应用指微信开放平台下的不同用户.) 1.  申请测试号(获得appID.appsecret) 2.  填写服务器配置并验 ...