LeetCode算法扫题系列19
原创作品,可以转载,但是请标注出处地址:https://www.cnblogs.com/V1haoge/p/9104677.html
LeetCode算法第19题(难度:中等)
题目:给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点。(English:Given a linked list, remove the n-th node from the end of list and return its head.)
示例:
给定一个链表: 1->2->3->4->5, 和 n = 2. 当删除了倒数第二个节点后,链表变为 1->2->3->5.
说明:
给定的 n 保证是有效的。
进阶:
你能尝试使用一趟扫描实现吗?
提示:Maintain two pointers and update one with a delay of n steps.
简述实现思路:
普通思路:那就是两次遍历,首次遍历需要查出列表的长度,第二次遍历根据n找到指定删除的节点,删除即可。
进阶思路:根据提示中的内容,我们设立两个指针,分别指向相距n个节点的两个节点,然后保持n间距不变,遍历列表,当后面指针到达链表尾节点的时候,那么前面的指针正好指向的是待删除的节点。
Java代码实现:(简单实现)
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public ListNode removeNthFromEnd(ListNode head, int n) {
ListNode node = head;
int length = 0;
do {
length++;
node = node.next;
} while(node !=null);//结束时node指向尾节点 if(n == length){//删除头结点
return head.next;
}else{
node = head;
int m = 0;
while(true){
m++;
if(m == length - n){//找到待删元素的前一个元素
node.next = node.next.next;
break;
}
node = node.next;
}
}
return head;
}
}
(进阶实现)
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public ListNode removeNthFromEnd(ListNode head, int n) {
ListNode node = head;
ListNode preNode = null;
int m = 0;
boolean isFirst = true;
while(node != null){
m++;
if(m > n){
isFirst = false;
if(m == n + 1){
preNode = head;
}else{
preNode = preNode.next;
}
}
node = node.next;
}
if(isFirst){
return head.next;
}
preNode.next = preNode.next.next;
return head;
}
}
进阶思路解析:node节点可以看成是遍历条件,也可以看成是双指针的后指针,当这个指针移动到尾节点时,前指针就就位了,其实前指针指向的是待删节点的前节点,也就是说两个指针之间的距离其实是n+1。遍历开始后m递增,当m<=n的时候只移动后指针,当m>n时前指针开始移动。这样当遍历结束,前指针就位删除其后一个节点即可。注意头节点需要单独处理,处理逻辑为27-29行,当然也包括18行的逻辑。
LeetCode算法扫题系列19的更多相关文章
- LeetCode算法扫题系列83
原创作品,可以转载,但是请标注出处地址:https://www.cnblogs.com/V1haoge/p/9104582.html LeetCode算法第83题(难度:简单) 题目:给定一个排序链表 ...
- C算法编程题系列
我的编程开始(C) C算法编程题(一)扑克牌发牌 C算法编程题(二)正螺旋 C算法编程题(三)画表格 C算法编程题(四)上三角 C算法编程题(五)“E”的变换 C算法编程题(六)串的处理 C算法编程题 ...
- leetcode 算法刷题(一)
今天开始刷Leetcode上面的算法题.我会更新我刷题过程中提交的代码(成功和不成功的都有)和比较好的解法 第二题 Add Two Numbers 题目的意思:输入两个链表,这两个链表都是倒序的数字, ...
- leetcode算法刷题(五)——动态规划(三)
今天的题目不是leetcode上面的.只是觉得动态规划还是不算很熟练,就接着找了点DP的题练练 最长递增子序列的长度 题目的意思:传入一个数组,要求出它的最长递增子序列的长度.例如:如在序列1,-1, ...
- leetcode算法刷题(三)
今天在刷了几道简单的动态规划后,又看了看string方面的题 第五题 Longest Palindromic Substring 题目的意思:求一个字符串的最长回文子串 分析:开始,我的想法是,现在字 ...
- Leetcode算法刷题:217和219题 Contains Duplicate
从题目名字就可以看出这两道题是相似的,219是217的加强版 217:Contains Duplicate 题目 给予一个数组,判断是否有重复的元素.如果有就返回True,没有就返回False.以下是 ...
- leetcode算法刷题(四)——动态规划(二)
又到了晚上,动态规划,开刷! 第121题 Best Time to Buy and Sell Stock 题目的意思:给予一个数组price,表示特定股票在某天的股价,里面第i个数表示第i天的价格.只 ...
- leetcode算法刷题(二)——动态规划(一)
上次刷了五六道题,都是关于string处理的,这次想换个知识点刷一下,然后再回头刷string的题,当做复习.. 这几天主要会选择动态规划的题目,因为以前从没刷过这方面的东西,很多东西都不是很懂..就 ...
- Leetcode算法刷题:第100题 Same Tree
Same Tree 题目 给予两棵二叉树,判断这两棵树是否相等(即各节点的值都一样) 解题思路 分别遍历两棵二叉树,并用列表分别存储这两棵树的节点的值,比较这两个列表就可以了 class Soluti ...
随机推荐
- Win7 VS2017编译magnum及例子
magnum是一个开源的图形中间件 Lightweight and modular C++11/C++14 graphics middleware for games and data visuali ...
- web网页、手机app设计规范
app设计规范 目前,很多APP设计师的APP Ui设计稿是先做iPhone6的,方便向上适配iPhone6Plus,也方便向下适配iPhone5和iPhone4的尺寸.这一节课也算是25学堂为大家精 ...
- http中post和get方法区别
- [转]Java工程师技术栈--成神之路
一.基础篇 1.1 JVM 1.1.1. Java内存模型,Java内存管理,Java堆和栈,垃圾回收 http://www.jcp.org/en/jsr/detail?id=133http://if ...
- python猜数字GUI版本V0.2
使用类方式编写猜数字游戏GUI版本. 思路:初始化数字以及初始化wegdits,编写button click event判断代码的函数,每猜一次点击button调用一次该函数,并计算猜的次数.如果猜对 ...
- 图像处理及opencv汇总
OPENCV——C++ 1.windows基于vs2017的opencv安装 2.为opencv添加contrib库 3.opencv源码编写规则 4.OpenCV库框架结构 5.OpenCV从2到3 ...
- CSS+DIV布局中absolute和relative区别
原文:http://developer.51cto.com/art/201009/225201.htm 这里向大家简单介绍一下CSS+DIV布局中absolute和relative属性的用法和区别,定 ...
- 瞎搞poj1013
http://poj.org/problem?id=1013 题意:给你标记从A到L的石子,其中有一个石子,可能会轻于其它石子,也可能重于其它石子.你只能通过三次天平的测量去找到这个石子.天平的三个状 ...
- WPF的AutoCompleteBox控件
AutoCompleteBox怎么用,网上都能查得到,本文就不再赘述. 最近在用的时候,发现一个小BUG,当匹配数据的个数超过了Drop页面能够显式的数据个数时,如果此时一直按键盘上“向下的箭头”,你 ...
- 公司项目接触到了FormData,总结一下
Javascript FormData() 对象! 1.创建 var formData = new FormData(); 2.如果有form对象 则先获取form表单 然后初始化时直接加入进去 eg ...