codeTop100题(30)19. 删除链表的倒数第 N 个结点

84 阅读1分钟

1. 题目

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

2. 分析

我们需要删除倒数第n个节点,但是我们不知道链表的长度是多少。 image.png

2.1 先求长度

通过一次遍历,获取链表的长度,然后第二次便利删除倒数第n个,也就是将第(l-n)个的指针指向next.next 时间复杂度o(2l),空间复杂度o(1)

2.2 存储各个节点

减少方法1中的第二次遍历,采取空间换时间的方式,从数组或者list中直接o(1)复杂度获取节点。 时间复杂度o(l),空间复杂度o(l)

2.3 双指针

两个指针,其中一个永远快n步 image.png

3. 代码

public ListNode removeNthFromEnd(ListNode head, int n) {
    ListNode newHead = head;
    //快指针先走n步
    ListNode fast = head;
    for (int i = 0; i < n; i++) {
        fast = fast.next;
    }
    if (fast == null) {
        return head.next;
    }
    //一直后移
    while (null != fast.next) {
        head = head.next;
        fast = fast.next;
    }
    //删除倒数第n个
    head.next = head.next.next;
    return newHead;
}