C++ 链表删除倒数第 n 个结点的代码分析及优化
这段代码旨在实现删除链表的倒数第 n 个结点,但存在以下漏洞:
- 当链表为空时,无法处理,会导致错误。
- 当链表只有一个结点时,删除该结点后需要将头结点置为 NULL。
- 在递归函数中,'k' 的初始值应该为 1,而不是 0。
- 在递归函数中,'m-n == k' 的判断条件不正确,应该为 'm-n == n-1'。
- 在递归函数中,删除结点后应该返回头结点,而不是 0。
以下是代码示例:
int di(ListNode* L, int n, int k) {
if (L == NULL) {
if (k - 1 == n) return -1; // 删除头结点,返回第二个结点即可
return k - 1;
}
int m = di(L->next, n, k++); // 5
if (m - n == n - 1) { // 修正判断条件
ListNode* q = L->next;
L->next = q->next;
delete (q);
return L; // 返回头结点
}
return m;
}
ListNode* removeNthFromEnd(ListNode* head, int n) {
if (head->next == NULL) {
head = NULL;
return head;
}
int x = di(head, n, 1); // 修正初始值
if (x == -1) {
ListNode* q = head;
head = head->next;
delete (q);
}
return head;
}
优化后的代码解决了以下问题:
- 添加了对空链表的处理。
- 当链表只有一个结点时,正确处理了头结点。
- 修正了递归函数中 'k' 的初始值和判断条件。
- 修正了递归函数中删除结点后的返回值。
经过优化后,代码能够正确地删除链表的倒数第 n 个结点。
原文地址: https://www.cveoy.top/t/topic/ntIM 著作权归作者所有。请勿转载和采集!