您的位置:首页 > 其它

LeetCode-19 删除链表的倒数第N个节点(一遍扫描)

2019-07-24 18:31 295 查看
版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。 本文链接:https://blog.csdn.net/qq_43622230/article/details/97149359

LeetCode-19 删除链表的倒数第N个节点(一遍扫描)

题目链接:LeetCode-19
题目大意:移除倒数第n个节点

解题思路:首先就是两遍扫描 第一遍扫描出链表的长度 将倒数第n个节点转化为正数第n个节点 第二遍扫描进行删除
重点的进阶部分为 一趟扫描完成
我的实现思路是运用三个节点 一个前驱(second) 一个后驱(first) 一个后驱的前一个状态(rec)
和储存链表长度的size还有当前前驱的坐标值
一遍扫描 首先扫描的前提是前驱的下一个节点不能为空 扫描过程中 如果前驱的坐标值不等于n就让前驱向后移动一位 坐标加一 如果坐标值等于n 那么就让前后驱都向后移动一位(这里注意保存后驱移动前的节点 也就是rec要指向的节点)最后循环终止时 你会发现现在的前驱刚好落在要删除的节点上 那么要操作的节点就是记录前驱历史的rec (最后打个补丁 如果根据size发现删除的是头节点 直接操作head 不然会Wa)
看着挺花里胡哨的(其实是我表述不清) 找个长一点的例子试一下就明白了

代码块:

/**
* 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 first = head;
ListNode second = head;
ListNode rec = head;
int size = 1;
int index = 1;
// 通过这个循环就可以让first指向要删除的节点 rec执行要改next的节点
while(second.next != null){
if(index == n){
rec = first;
second = second.next;
first = first.next;
}else{
second = second.next;
index++;
}
size++;
}
if(n == size){
head = head.next;
}else if(rec.next != null){
rec.next = rec.next.next;
}
return head;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: