leetcode19:Remove Nth Node From End of List
2016-03-03 15:15
357 查看
Given a linked list, remove the nth node from the end of list and return its head.
这道题的要求是删除链表的倒数第k个节点, 只要能查找到倒数第k个节点,删除啥的就好说了。
实现查找不难,两次遍历链表,第一遍记录链表长度,第二次直接遍历到倒数第k个即可。难点在于如何设计高效的算法一次遍历链表实现查找。
思路: 快慢指针。能否这样想,倒数第k个就是从末尾往前数第k个,而最后一个节点是空指针。设计两个指针,如果两个指针的距离始终是k,那么当后一个指针到尾节点时,前一个指针恰恰指向倒数第k个节点。这样,大概思路就出来了,后指针先遍历k个位置,然后前、后指针同步遍历,当后指针为空时,就找到了倒数第k个位置的节点。
这道题的要求是删除链表的倒数第k个节点, 只要能查找到倒数第k个节点,删除啥的就好说了。
实现查找不难,两次遍历链表,第一遍记录链表长度,第二次直接遍历到倒数第k个即可。难点在于如何设计高效的算法一次遍历链表实现查找。
思路: 快慢指针。能否这样想,倒数第k个就是从末尾往前数第k个,而最后一个节点是空指针。设计两个指针,如果两个指针的距离始终是k,那么当后一个指针到尾节点时,前一个指针恰恰指向倒数第k个节点。这样,大概思路就出来了,后指针先遍历k个位置,然后前、后指针同步遍历,当后指针为空时,就找到了倒数第k个位置的节点。
/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode(int x) { val = x; } * } */ public class Solution { public ListNode removeNthFromEnd(ListNode head, int n) { ListNode p=head;//快(后)指针 ListNode pre=head;//前指针的前指针,删除节点q使用 ListNode q=head.next;//慢(前)指针 for(int i=0;i<n;i++) p=p.next; if (p == null) //考虑边界情况,删除头结点 {return pre.next; //System.out.println("error n"); } else if(p.next==null){//考虑边界情况,删除尾节点 pre.next=q.next; return pre; } while(p.next!=null){ p=p.next; q=q.next; pre=pre.next; } pre.next=q.next; return head; } } 结果: 链表:12345678 K:3 输出:6
相关文章推荐
- Weblogic 两台Server Node 使用一台控制台(12c-version)
- 测试Node.js 应用程序
- nw.js node-webkit系列(15)如何使用内部模块和第三方模块进行开发
- 模拟namenode宕机:数据块损坏,该如何修复
- nodejs express request 和 response 对象的具体介绍:
- 初步使用Node连接Mysql数据库
- 《Inode与Block重要知识总结核心讲解》
- 使用Node.js+Socket.IO搭建WebSocket实时应用
- leetcode第24题——**Swap Nodes in Pairs
- [LeetCode]237. Delete Node in a Linked List
- 一个基于node与mysql的打卡小应用
- lintcode-easy-Nth to Last Node in List Show result
- 《Node.js开发实战详解》学习笔记
- 初步使用Node连接Mysql数据库
- 24. Swap Nodes in Pairs
- [LeetCode OJ] 19. Remove Nth Node From End of List
- node.js 安装配置 npm ,express,ejs模板
- 使用Node.js+Socket.IO搭建WebSocket实时应用【转载】
- Leetcode ☞237. Delete Node in a Linked List ☆
- 24. Swap Nodes in Pairs