给你一个列表,删除列表的倒数第n个节点,并且返回链表的头节点你能尝试使用一趟扫描实现吗。使用c++语言写程序。 LIsNode* removeNthFromEnd(ListaNode* head, int )
时间: 2024-10-20 21:19:28 浏览: 20
1.3.2 给定一个链表,删除链表的倒数第N个节点,并且返回链表的头结点.md
在C++中,可以使用双指针法(快慢指针)来实现这个功能,一次遍历即可完成。首先定义两个指针,`slow` 指向当前节点,`fast` 指向前一个节点。当需要删除倒数第 `n` 个节点时,我们可以让 `fast` 指针先前进 `n+1` 步,然后两者同时开始移动,直到 `fast` 到达链表尾部。此时,`slow` 就指向了倒数第 `n` 个节点的前一个节点。
接下来,删除 `slow->next` 并将 `slow` 的下一个节点赋值给 `slow`,这样 `slow` 就会成为新链表的最后一个节点。最后返回 `head`,它就是新的链表头节点。
以下是完整的 C++ 代码示例:
```cpp
#include <iostream>
using namespace std;
// 定义链表节点结构
struct ListNode {
int val;
ListNode *next;
ListNode(int x) : val(x), next(NULL) {}
};
ListNode* removeNthFromEnd(ListNode* head, int n) {
if (head == nullptr || n >= 0) return head; // 如果链表为空或n无效,直接返回
ListNode* fast = head;
ListNode* slow = head;
for (int i = 0; i < n + 1; ++i) {
fast = fast->next; // 快速指针前进
if (fast == nullptr) return head; // 链表长度小于 n+1,直接返回
}
while (fast != nullptr) { // 两指针同步到链表尾部
slow = slow->next;
fast = fast->next;
}
// 删除倒数第n个节点并更新链表
slow->next = slow->next->next;
return head;
}
// 打印链表辅助函数
void printList(ListNode* head) {
while (head != nullptr) {
cout << head->val << " ";
head = head->next;
}
cout << endl;
}
```
阅读全文