📌  相关文章
📜  C++ 程序,用于在倒数第 N 个节点之后插入一个节点(1)

📅  最后修改于: 2023-12-03 15:29:53.030000             🧑  作者: Mango

在倒数第 N 个节点之后插入一个节点

当我们需要在链表中插入一个节点,但是我们仅知道链表的倒数第 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。