问题:

Given a linked list, remove the nth node from the end of list and return its head.

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

官方难度:

Easy

翻译:

给定一个链表,删除其中倒数第n个节点,方法返回头节点。

例子:

链表: 1->2->3->4->5,n=2。

删除节点后的链表:1->2->3->5。

  1. 本题的节点定义,同No.002(Add Two Numbers)相同。
  2. 首先需要确定,给定链表的长度,之后定位待删除的节点,和此节点的前一个节点。由于是原生态的链表,没有现成的定位方法,所以为了提高效率,在确定链表长度的同时,将节点放入容器中,以便之后获取节点。
  3. 需要考虑删除第一个节点的特殊情况,此时没有上一个节点。
  4. 将失去引用的节点,即删除的节点置null,防止可能的内存泄漏。
  5. 最后剩下一个问题,使用什么容器合适?HashMap和ArrayList在性能上要比LinkedList要高,HashMap空间占用更大,所以应该是用ArrayList比较好。不过ArrayList是基于数组实现的,所以我也尝试着使用一个长度不断扩张的数组来实现。
  6. 最后入参检查,对n的检查放在确定链表长度之后。

解题代码:

     public static ListNode removeNthFromEnd(ListNode head, int n) {
if (head == null) {
throw new IllegalArgumentException("Input error");
}
ListNode current = head;
ListNode[] array = new ListNode[] {};
int length = 1;
while (current != null) {
array = extendArray(array, current);
current = current.next;
length++;
}
if (n > length) {
throw new IllegalArgumentException("Input error");
}
// 记录删除节点,以及上一个节点
int index = length - n;
int lastIndex = length - n - 1;
// 删除第一个节点的情况
if (lastIndex == 0) {
head = head.next;
} else {
ListNode deleteNode = array[index - 1];
ListNode lastNode = array[lastIndex - 1];
lastNode.next = deleteNode.next;
deleteNode = null;
}
return head;
} private static ListNode[] extendArray(ListNode[] array, ListNode node) {
ListNode[] listArray = new ListNode[array.length + 1];
System.arraycopy(array, 0, listArray, 0, array.length);
listArray[array.length] = node;
return listArray;
} private static class ListNode {
int val;
ListNode next; ListNode(int x) {
val = x;
}
}

removeNthFromEnd

相关链接:

https://leetcode.com/problems/remove-nth-node-from-end-of-list/

https://github.com/Gerrard-Feng/LeetCode/blob/master/LeetCode/src/com/gerrard/algorithm/easy/Q019.java

PS:如有不正确或提高效率的方法,欢迎留言,谢谢!

No.019:Remove Nth Node From End of List的更多相关文章

  1. LeetCode之“链表”:Remove Nth Node From End of List

    题目链接 题目要求: Given a linked list, remove the nth node from the end of list and return its head. For ex ...

  2. 【LeetCode算法题库】Day7:Remove Nth Node From End of List & Valid Parentheses & Merge Two Lists

    [Q19] Given a linked list, remove the n-th node from the end of list and return its head. Example: G ...

  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. LeetCode OJ:Remove Nth Node From End of List(倒序移除List中的元素)

    Given a linked list, remove the nth node from the end of list and return its head. For example, Give ...

  5. lintcode:Remove Nth Node From End of Lis 删除链表中倒数第n个节点

    题目: 删除链表中倒数第n个节点 给定一个链表,删除链表中倒数第n个节点,返回链表的头节点.  样例 给出链表1->2->3->4->5->null和 n = 2. 删除 ...

  6. LeetCode 019 Remove Nth Node From End of List

    题目描述:Remove Nth Node From End of List Given a linked list, remove the nth node from the end of list ...

  7. 63. Swap Nodes in Pairs && Rotate List && Remove Nth Node From End of List

    Swap Nodes in Pairs Given a linked list, swap every two adjacent nodes and return its head. For exam ...

  8. Merge Two Sorted Lists & Remove Nth Node From End of List

    1.合并两个排好序的list Merge Two Sorted Lists Merge two sorted linked lists and return it as a new list. The ...

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

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

随机推荐

  1. Atitit attilax在自然语言处理领域的成果

    Atitit attilax在自然语言处理领域的成果 1.1. 完整的自然语言架构方案(词汇,语法,文字的选型与搭配)1 1.2. 中文分词1 1.3. 全文检索1 1.4. 中文 阿拉伯文 英文的简 ...

  2. JS---DOM操作有哪一些

    一  DOM对象有哪一些 1   windos 1.属性  opener 2.方法  open(),close() 例:<script langguage="javascript&qu ...

  3. 获取当前请求的URL的地址、参数、参数值、各种属性

    //URL: http://localhost:1897/User/Press/UserContent.aspx/9878?id=1#toc Request.ApplicationPath; //结果 ...

  4. 快速入门系列--WCF--03RESTFUL服务与示例

    之前介绍了基于SOAP的Web服务,接下来将介绍基于REST的轻量级的Web服务. REST(Representational State Transfer)与技术无关,代表一种软件架构风格,可以成为 ...

  5. 浏览器加载和渲染html的顺序

    前阵子,在组内给大家做了一次关于“浏览器加载和渲染HTML的顺序”的分享,这里再总结一下吧. AD:干货来了,不要等!WOT2015 北京站演讲PPT开放下载! 1.浏览器加载和渲染html的顺序 浏 ...

  6. MemCache在win7上的可视化配置以及Nodejs/Net应用

    惯例科普:MemCache是一套分布式的高速缓存系统,由LiveJournal的Brad Fitzpatrick开发,但目前被许多网站使用以提升网站的访问速度,尤其对于一些大型的.需要频繁访问数据库的 ...

  7. Spark入门实战系列--7.Spark Streaming(下)--实时流计算Spark Streaming实战

    [注]该系列文章以及使用到安装包/测试数据 可以在<倾情大奉送--Spark入门实战系列>获取 .实例演示 1.1 流数据模拟器 1.1.1 流数据说明 在实例演示中模拟实际情况,需要源源 ...

  8. 美妙的 CSS3 动画!一组梦幻般的按钮效果

    今天给大家带来的是五款梦幻般的动画按钮效果.下面是在线演示,把鼠标放在按钮上试试,有惊喜哦!CSS3 引入了众多供功能强大的新特性,让设计和开发人员能够轻松的创作出各种精美的界面效果. 温馨提示:为保 ...

  9. 原创:新手布局福音!微信小程序使用flex的一些基础样式属性

    来源:新手布局福音!微信小程序使用flex的一些基础样式属性 作者:Nazi   Flex布局相对于以前我们经常所用到的布局方式要好的很多,在做微信小程序的时候要既能符合微信小程序的文档开发要求,又能 ...

  10. APPSCAN使用外部浏览器

    在使用appscan扫描时,自带浏览器可能存在兼容性问题(比如HTML5),故需要用到其他浏览器.在做139邮箱HTML5项目,需要使用chrome浏览器进行扫描.因此分享下如何使用外部浏览器,将之前 ...