这段代码旨在实现删除链表倒数第 n 个节点的功能,并返回链表的头结点。原始代码存在一些错误,导致无法正确实现删除操作。

原始代码错误分析:

  1. 计算链表长度时,应该将最后一个结点也计算在内,因为最后一个结点也可能是要删除的结点。

  2. 在删除操作时,应该先判断要删除的结点是否为头结点,如果是,则直接返回 head.next,否则再进行删除操作。

  3. 删除操作时,应该将 pre 和 next 指针都移到要删除的结点的前一个结点,而不是将 pre 移到要删除的结点,因为需要修改 pre 的 next 指针。

优化后的代码:

public ListNode removeNthFromEnd(ListNode head, int n) {
    if (head == null) {
        return head;
    }
    // 计算链表长度
    int len = 0;
    ListNode temp = head;
    while (temp != null) {
        len++;
        temp = temp.next;
    }
    // 计算要删除的结点的位置
    int index = len - n;
    // 判断要删除的结点是否为头结点
    if (index == 0) {
        return head.next;
    }
    // 将 pre 和 next 指针都移到要删除的结点的前一个结点
    ListNode pre = head;
    ListNode next = head.next;
    for (int i = 0; i < index - 1; i++) {
        pre = pre.next;
        next = next.next;
    }
    // 删除结点
    pre.next = next.next;
    return head;
}

代码说明:

  1. 首先判断链表是否为空,如果为空直接返回 head。

  2. 遍历链表计算链表长度。

  3. 计算要删除的结点的位置 index。

  4. 判断要删除的结点是否为头结点,如果是,直接返回 head.next。

  5. 将 pre 和 next 指针都移到要删除的结点的前一个结点。

  6. 将 pre 的 next 指针指向 next 的 next,实现删除操作。

  7. 最后返回链表的头结点。

通过以上优化,代码可以正确地删除链表倒数第 n 个节点。

Java 链表删除倒数第 n 个节点算法优化与错误分析

原文地址: http://www.cveoy.top/t/topic/nj49 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录