📅  最后修改于: 2023-12-03 15:29:53.030000             🧑  作者: Mango
当我们需要在链表中插入一个节点,但是我们仅知道链表的倒数第 N 个节点位置,该如何做呢?
以下是一个 C++ 程序,用于在倒数第 N 个节点之后插入一个节点。
#include <iostream>
struct ListNode {
int val;
ListNode *next;
ListNode(int x) : val(x), next(NULL) {}
};
void insertAfter(ListNode* target, ListNode* node) {
node->next = target->next;
target->next = node;
}
ListNode* insertNthFromEnd(ListNode* head, int n, int newVal) {
ListNode* dummy = new ListNode(0);
dummy->next = head;
ListNode* slow = dummy;
ListNode* fast = dummy;
for(int i=1; i<=n+1; i++) {
fast = fast->next;
}
while(fast) {
slow = slow->next;
fast = fast->next;
}
ListNode* newNode = new ListNode(newVal);
insertAfter(slow, newNode);
ListNode* result = dummy->next;
delete dummy;
return result;
}
int main() {
ListNode* head = new ListNode(1);
ListNode* node2 = new ListNode(2);
ListNode* node3 = new ListNode(3);
ListNode* node4 = new ListNode(4);
ListNode* node5 = new ListNode(5);
head->next = node2;
node2->next = node3;
node3->next = node4;
node4->next = node5;
insertNthFromEnd(head, 2, 99);
ListNode* curr = head;
while(curr) {
std::cout << curr->val << " ";
curr = curr->next;
}
std::cout << std::endl;
return 0;
}
代码说明:
ListNode
结构体用于表示一个链表节点。insertAfter
函数用于在目标节点后插入一个新节点。insertNthFromEnd
函数是本程序的核心函数,用于插入一个节点到链表的倒数第 N 个节点之后。dummy
节点是为了方便在头节点上做插入操作而创建的虚拟节点,它的值为 0。fast
先走 n+1 步,使得 slow
引用的节点就是倒数第 n+1 个节点。fast
继续往前走,慢指针 slow
也跟着往前走,直到快指针到达链表的末尾。slow
指向倒数第 N 个节点,我们在它后面插入一个新节点。输出结果:
1 2 3 99 4 5
可以看到,我们成功地在倒数第 2 个节点后插入了一个新节点 99。