删除链表的第n个节点

给定一个链表,删除链表的倒数第 个节点,并且返回链表的头结点。

示例:

给定一个链表: 1->2->3->4->5, 和 n = 2.
当删除了倒数第二个节点后,链表变为 1->2->3->5.

说明:

给定的 n 保证是有效的。

进阶:

你能尝试使用一趟扫描实现吗?

摘要

本文适用于初学者。它介绍了以下内容: 链表的遍历和删除其末尾的第 n 个元素。

解决方案

方法一:两次遍历算法

思路

我们注意到这个问题可以容易地简化成另一个问题:删除从列表开头数起的第 (L−n+1)(L - n + 1)(L−n+1) 个结点,其中 LLL 是列表的长度。只要我们找到列表的长度 LLL,这个问题就很容易解决。

算法

首先我们将添加一个哑结点作为辅助,该结点位于列表头部。哑结点用来简化某些极端情况,例如列表中只含有一个结点,或需要删除列表的头部。在第一次遍历中,我们找出列表的长度 LLL。然后设置一个指向哑结点的指针,并移动它遍历列表,直至它到达第 (L−n)(L - n)(L−n) 个结点那里。我们把第 (L−n)(L - n)(L−n) 个结点的 next 指针重新链接至第 (L−n+2)(L - n + 2)(L−n+2) 个结点,完成这个算法。

 public ListNode removeNthFromEnd(ListNode head, int n) {
ListNode dummy = new ListNode(0);
dummy.next = head;
int length = 0;
ListNode first = head;
while (first != null) {
length++;
first = first.next;
}
length -= n;
first = dummy;
while (length > 0) {
length--;
first = first.next;
}
first.next = first.next.next;
return dummy.next;
}

方法二:一次遍历算法

算法

上述算法可以优化为只使用一次遍历。我们可以使用两个指针而不是一个指针。第一个指针从列表的开头向前移动 n+1n+1n+1 步,而第二个指针将从列表的开头出发。现在,这两个指针被 nnn 个结点分开。我们通过同时移动两个指针向前来保持这个恒定的间隔,直到第一个指针到达最后一个结点。此时第二个指针将指向从最后一个结点数起的第 nnn 个结点。我们重新链接第二个指针所引用的结点的 next 指针指向该结点的下下个结点。

 public ListNode removeNthFromEnd(ListNode head, int n) {
ListNode dummy = new ListNode(0);
dummy.next = head;
ListNode first = dummy;
ListNode second = dummy;
// Advances first pointer so that the gap between first and second is n nodes apart
for (int i = 1; i <= n + 1; i++) {
first = first.next;
}
// Move first to the end, maintaining the gap
while (first != null) {
first = first.next;
second = second.next;
}
second.next = second.next.next;
return dummy.next;
}

leetcode 19.删除链表的第n个节点的更多相关文章

  1. Java实现 LeetCode 19删除链表的倒数第N个节点

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

  2. LeetCode 19——删除链表的倒数第N个节点(JAVA)

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

  3. [LeetCode] 19. 删除链表的倒数第N个节点

    题目链接:https://leetcode-cn.com/problems/remove-nth-node-from-end-of-list/ 题目描述: 给定一个链表,删除链表的倒数第 n 个节点, ...

  4. leetcode 19. 删除链表的倒数第N个节点 JAVA

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

  5. LeetCode 19——删除链表的倒数第 N 个节点

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

  6. [LeetCode] 19. 删除链表的倒数第N个节点 ☆☆☆

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

  7. LeetCode 19. 删除链表的倒数第N个节点(Remove Nth Node From End Of List)

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

  8. LeetCode 19.删除链表的倒数第N个节点(Python)

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

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

    题目链接:https://leetcode-cn.com/problems/remove-nth-node-from-end-of-list/ 题解: 两个 $p,q$ 指针均指向头,然后 $q$ 先 ...

随机推荐

  1. [C++ STL] set使用详解

    一.set介绍: set容器内的元素会被自动排序,set与map不同,set中的元素即是键值又是实值,set不允许两个元素有相同的键值.不能通过set的迭代器去修改set元素,原因是修改元素会破坏se ...

  2. Codefoces 828C

    C. String Reconstruction time limit per test 2 seconds memory limit per test 256 megabytes input sta ...

  3. Joseph UVA 1452 Jump

    题目传送门 /* 数学:约瑟夫环问题的变形,首先定义f[i]表示剩下i个人时,最后一个选出的人,有个公式:f[i] = (f[i-1] + m) % i f[1] = 0(编号从0开始),那么类似最后 ...

  4. Oracle 参考脚本

    一.创建物化视图 --新建表空间 CREATE TABLESPACE MLOG_TBS LOGGING DATAFILE 'mlog_tbs.dbf' SIZE 32M AUTOEXTEND ON N ...

  5. xcode 制作静态库文件(.a)

    参考: http://www.jb51.net/article/37853.htm 摘要: 1. 获取.a文件的信息              lipo -info /Users/pjk1129/De ...

  6. 14 C#编程中的逻辑运算

    在C#编程中,我们经常需要处理这些情况. 1. 某种条件为真时,程序这样处理:当某种条件为假时,程序那样处理. 2. 当某种条件为真时,程序一直这样处理: 这里的条件,在C#中就是逻辑运算.接下来我就 ...

  7. C#知识点-枚举器和迭代器

    一.几个基本概念的理解 问题一:为什么数组可以使用foreach输出各元素 答:数组是可枚举类型,它实现了一个枚举器(enumerator)对象:枚举器知道各元素的次序并跟踪它们的位置,然后返回请求的 ...

  8. javascript 数字日期格式转换为中文

    写一个函数,把数字日期如2014-06-21转换为 二零一四年六月二十一日星期三 function convert(dateStr) { var dict = { "0": &qu ...

  9. gdb如何保存和读取断点

    刚开始在linux下学编程使用gdb的同学可能会发现,每次用gdb设置断点调试程序,但下次打开的时候所有断点都没有了,很不方便.下面介绍保存和读取断点的方法. 1. 保存断点 先用info b 查看一 ...

  10. Json-->Newton.Json.dll的使用方法

    Newton.Json.dll  for .NET2.0 实体1 public class Student    {        public string ID { get; set; }     ...