Java 链表删除倒数第 n 个节点算法优化与错误分析
这段代码旨在实现删除链表倒数第 n 个节点的功能,并返回链表的头结点。原始代码存在一些错误,导致无法正确实现删除操作。
原始代码错误分析:
-
计算链表长度时,应该将最后一个结点也计算在内,因为最后一个结点也可能是要删除的结点。
-
在删除操作时,应该先判断要删除的结点是否为头结点,如果是,则直接返回 head.next,否则再进行删除操作。
-
删除操作时,应该将 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;
}
代码说明:
-
首先判断链表是否为空,如果为空直接返回 head。
-
遍历链表计算链表长度。
-
计算要删除的结点的位置 index。
-
判断要删除的结点是否为头结点,如果是,直接返回 head.next。
-
将 pre 和 next 指针都移到要删除的结点的前一个结点。
-
将 pre 的 next 指针指向 next 的 next,实现删除操作。
-
最后返回链表的头结点。
通过以上优化,代码可以正确地删除链表倒数第 n 个节点。
原文地址: http://www.cveoy.top/t/topic/nj49 著作权归作者所有。请勿转载和采集!