原创作品,可以转载,但是请标注出处地址:https://www.cnblogs.com/V1haoge/p/9104677.html

LeetCode算法第19题(难度:中等)

题目:给定一个链表,删除链表的倒数第 个节点,并且返回链表的头结点。(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的更多相关文章

  1. LeetCode算法扫题系列83

    原创作品,可以转载,但是请标注出处地址:https://www.cnblogs.com/V1haoge/p/9104582.html LeetCode算法第83题(难度:简单) 题目:给定一个排序链表 ...

  2. C算法编程题系列

    我的编程开始(C) C算法编程题(一)扑克牌发牌 C算法编程题(二)正螺旋 C算法编程题(三)画表格 C算法编程题(四)上三角 C算法编程题(五)“E”的变换 C算法编程题(六)串的处理 C算法编程题 ...

  3. leetcode 算法刷题(一)

    今天开始刷Leetcode上面的算法题.我会更新我刷题过程中提交的代码(成功和不成功的都有)和比较好的解法 第二题 Add Two Numbers 题目的意思:输入两个链表,这两个链表都是倒序的数字, ...

  4. leetcode算法刷题(五)——动态规划(三)

    今天的题目不是leetcode上面的.只是觉得动态规划还是不算很熟练,就接着找了点DP的题练练 最长递增子序列的长度 题目的意思:传入一个数组,要求出它的最长递增子序列的长度.例如:如在序列1,-1, ...

  5. leetcode算法刷题(三)

    今天在刷了几道简单的动态规划后,又看了看string方面的题 第五题 Longest Palindromic Substring 题目的意思:求一个字符串的最长回文子串 分析:开始,我的想法是,现在字 ...

  6. Leetcode算法刷题:217和219题 Contains Duplicate

    从题目名字就可以看出这两道题是相似的,219是217的加强版 217:Contains Duplicate 题目 给予一个数组,判断是否有重复的元素.如果有就返回True,没有就返回False.以下是 ...

  7. leetcode算法刷题(四)——动态规划(二)

    又到了晚上,动态规划,开刷! 第121题 Best Time to Buy and Sell Stock 题目的意思:给予一个数组price,表示特定股票在某天的股价,里面第i个数表示第i天的价格.只 ...

  8. leetcode算法刷题(二)——动态规划(一)

    上次刷了五六道题,都是关于string处理的,这次想换个知识点刷一下,然后再回头刷string的题,当做复习.. 这几天主要会选择动态规划的题目,因为以前从没刷过这方面的东西,很多东西都不是很懂..就 ...

  9. Leetcode算法刷题:第100题 Same Tree

    Same Tree 题目 给予两棵二叉树,判断这两棵树是否相等(即各节点的值都一样) 解题思路 分别遍历两棵二叉树,并用列表分别存储这两棵树的节点的值,比较这两个列表就可以了 class Soluti ...

随机推荐

  1. 通过TensorFlow训练神经网络模型

    神经网络模型的训练过程其实质上就是神经网络参数的设置过程 在神经网络优化算法中最常用的方法是反向传播算法,下图是反向传播算法流程图: 从上图可知,反向传播算法实现了一个迭代的过程,在每次迭代的开始,先 ...

  2. python 线程Queue 用法代码展示

    from queue import Queue q = Queue(maxsize=3)#限制队列3个 #添加内容进去到队列 q.put(10) q.put(20) q.put(30) print(q ...

  3. position 小结

    position: static fixed relative absolute sticky 1.static static定位是HTML元素的默认值,即没有定位,元素出现在正常的流中.因此,这种定 ...

  4. postgresql数据库查询慢SQL

    --查询总耗时最长SQLselect * from pg_stat_statements order by total_time desc;--查询平均耗时最长SQLselect * from pg_ ...

  5. Python OR & AND

    These are the Boolean operations, ordered by ascending priority: Operation Result Notes x or y if x ...

  6. Kerberos协议

    Kerberos协议主要用于计算机网络的身份鉴别 (authentication),其特点是用户只需输入一次身份验证信息就可以凭借此验证获得票据(ticket-granting-ticket)访问多个 ...

  7. JAVA泛型实现原理

    1. Java范型时编译时技术,在运行时不包含范型信息,仅仅Class的实例中包含了类型参数的定义信息.泛型是通过java编译器的称为擦除(erasure)的前端处理来实现的.你可以(基本上就是)把它 ...

  8. Javascript高级编程学习笔记(32)—— 客户端检测(1)能力检测

    能力检测 浏览器厂商虽然在实现公共接口方面投入了大量的精力 但是每种浏览器仍旧存在许多差异 为了让网页能跨浏览器的运行,对浏览器差异做的兼容处理自然无法避免 其中最常用的也就是我们现在所说的能力检测 ...

  9. Oracle创建表空间、用户管理、角色管理

    内容:Oracle创建表空间.用户管理.角色管理 1.用系统用户登录Oracle 默认的系统用户: sys/system.sysman.scott sys:权限最大,超级用户,可以完成所有任务, 默认 ...

  10. openjtag 的硬件连接踩坑历程

    这个事情踩了不少坑,这个要记录一下: 1 代码的下载和编译按照下面的来:https://github.com/pulp-platform/pulp-debug-bridge 注意点: A 要最好使用p ...