做题总结 19. 删除链表的倒数第 N 个结点(快慢指针思想)

文章介绍了如何在Java中使用快慢指针的方法,避免遍历链表长度,仅用一趟扫描就删除链表的倒数第N个节点。首先创建虚拟头节点,快指针先移动N步,然后两者同步移动直到快指针到达末尾,此时慢指针位置即为倒数第N个节点的前一个节点,删除后返回新的链表头。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

19. 删除链表的倒数第 N 个结点

最初的想法

计算出链表中的节点总数,然后遍历找到目标节点并删除。

class Solution {
    public ListNode removeNthFromEnd(ListNode head, int n) {
        ListNode cur = head;
        int count=0;
        while(cur != null) {
            count++;
            cur = cur.next;
        }
        //题目中规定n是小于节点数的 
        ListNode dummyhead = new ListNode(0,head);
        cur = dummyhead;
        for(int i=0; i<count-n; i++) {
            cur = cur.next;
        }
        cur.next = cur.next.next;
        return dummyhead.next;
    }
}

在这里插入图片描述

进阶

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

在这里插入图片描述
思路
① 如果要删除4节点,那么指针一定是要指在3节点处,才能达到删除目的。
② 还是使用虚拟头节点:优势为,不需要对操作的节点进行头结点的判断,可以用统一的方式删除。
③ 如何找到倒数第n个节点。快慢指针。

在这里插入图片描述
代码随想录中,fast指针直到 null,作为结束,但是如果遵循【fast先动n步,slow和fast同时移动,直至fast.next=null】,也可以实现。

实现(Java)

下面代码的规则为:
① fast先移动n步
② slow和fast同时移动,直至 fast.next=null;(请注意这里与代码随想录有些许不同)
slow.next = slow.next.next; 删除

class Solution {
    public ListNode removeNthFromEnd(ListNode head, int n) {
        //虚拟头节点
        ListNode dummyhead = new ListNode(-1,head);
        ListNode slow,fast;
        slow = fast = dummyhead;
        
		//① fast先移动n步
        for(int step = 1; step <= n; step++) {
            fast = fast.next;
        }

        while(fast.next != null) {
            slow = slow.next;//② slow和fast同时移动
            fast = fast.next;
        }
        slow.next = slow.next.next;//删除节点

        return dummyhead.next;
    }
}

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值