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

该博客介绍了如何使用快慢指针法解决删除链表倒数第N个节点的问题。首先,让快指针前进N步,然后同时移动快慢指针,直到快指针到达链表尾部。此时,慢指针所指的就是倒数第N+1个节点,将其next指向next的next即可完成删除操作。这种方法在一次遍历中实现了问题的解决,具有O(n)的时间复杂度和O(1)的空间复杂度。
摘要由CSDN通过智能技术生成

题目描述:(题目来源:19. 删除链表的倒数第 N 个结点
给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。

进阶:你能尝试使用一趟扫描实现吗?
在这里插入图片描述
输入:head = [1,2,3,4,5], n = 2
输出:[1,2,3,5]

这一题有个简单的方法就是快慢指针法(定位链表中的特定位置),快指针和慢指针最初都指向头节点。
一:先让快指针往后走n步,然后判断快指针是否为null,如果为null,证明这个n就是链表的长度,我们把第一个结点删除返回head.next就行了。
二:如果不为null,就让快指针和慢指针都往后移动,当快指针的next为null的时候,慢指针正好指向倒数第n+1个结点。
三:我们只需要把此时慢指针的next指向慢指针的next的next就行了,最后把head返回。
四:只遍历了一遍链表时间复杂度为O(n),只定义了一些辅助参数空间复杂度为O(1)。

class Solution {
    public ListNode removeNthFromEnd(ListNode head, int n) {
        ListNode first = head;
        ListNode second = head;
        //如果是个空链表,直接返回就行了
        if(head == null){
            return head;
        }
        while(n > 0){
            first = first.next;
            n--;
        }
        //先让快指针往后走n步,然后判断快指针是否为null,如果为null,证明这个n就是链表的长度,我们把第一个结点删除返回head.next就行了。
        if(first == null){
            return head.next;
        }
        while(first.next != null){
            first = first.next;
            second = second.next;
        }
        //删除结点操作
        second.next = second.next.next;
        return head;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值