力扣19.删除链表的倒数第N个节点

题目链接:19. 删除链表的倒数第 N 个结点 - 力扣(LeetCode)

给你一个链表,删除链表的倒数第 n个结点,并且返回链表的头结点。

示例 1:

输入: head = 1,2,3,4,5, n = 2
输出:1,2,3,5

示例 2:

输入: head = 1, n = 1
输出:\[\]

示例 3:

输入: head = 1,2, n = 1
输出:1

提示:

  • 链表中结点的数目为 sz

  • 1 <= sz <= 30

  • 0 <= Node.val <= 100

  • 1 <= n <= sz

两趟扫描

java 复制代码
/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode() {}
 *     ListNode(int val) { this.val = val; }
 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 * }
 */
class Solution {
    public ListNode removeNthFromEnd(ListNode head, int n) {
        ListNode pre=new ListNode();
        ListNode curr=null;
        pre.next=head;
        curr=pre;
        //倒数第n个节点即正数第num-n+1个节点
        int num=0;
        while(curr.next!=null){
            num++;//记录链表节点总个数
            curr=curr.next;
        }
        int N=num-n+1;//正数第N个节点
        curr=pre;
        int c=N-1;//循环次数
        while(c!=0){
            curr=curr.next;
            c--;
        }
        curr.next=curr.next.next;
        return pre.next;
    }
}

**进阶:**你能尝试使用一趟扫描实现吗?

一趟扫描(双指针)

如果要删除倒数第n个节点,让fast先移动n步,然后让fast和slow同时移动,直到fast指向链表末尾。删掉slow所指向的节点就可以了。

java 复制代码
/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode() {}
 *     ListNode(int val) { this.val = val; }
 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 * }
 */
class Solution {
    public ListNode removeNthFromEnd(ListNode head, int n) {
        ListNode dumyhead=new ListNode();
        dumyhead.next=head;
        ListNode fast=dumyhead;
        ListNode low=dumyhead;

        //fast比low先走n步
        while(n!=0){
            fast=fast.next;
            n--;
        }
        while(fast.next!=null){
            fast=fast.next;
            low=low.next;
        }
        low.next=low.next.next;
        return dumyhead.next;
    }
}
相关推荐
罗西的思考3 小时前
【Agent OS / AIOS】AOHP 深度解读:当 OS 开始为 Agent 而设计
人工智能·算法·机器学习
民乐团扒谱机3 小时前
【微实验】组合优化matlab实战(马科维茨投资模型):在收益与风险之间,寻找最优的人生配比
大数据·人工智能·算法·机器学习·数学建模·matlab·组合优化
Nil2084 小时前
leetcode 160相交链表
算法·leetcode·链表
迷途之人不知返5 小时前
算法系列2:滑动窗口
算法
Herbert_hwt5 小时前
C语言零基础入门:循环控制与数据类型详解
c语言·数据结构·算法
ZC跨境爬虫7 小时前
LeetCode 108. 将有序数组转换为二叉搜索树(递归构建详解 + Java Python 实现)
java·python·leetcode
Tisfy7 小时前
LeetCode 3090.每个字符最多出现两次的最长子字符串:二重循环 / 滑动窗口
算法·leetcode·字符串·题解·模拟·双指针·滑动窗口
-dzk-7 小时前
【技巧】LC 136.只出现一次的数字
算法·异或
有点。7 小时前
C++二叉树二(练习题)
数据结构·c++·算法·图论
LuminousCPP7 小时前
栈和队列专题(一):LeetCode 20. 有效的括号
数据结构·经验分享·笔记·leetcode·手写栈