📌  相关文章
📜  C ++程序将链接列表合并到另一个链接列表中的备用位置(1)

📅  最后修改于: 2023-12-03 14:39:39.332000             🧑  作者: Mango

C++程序将链接列表合并到另一个链接列表中的备用位置

本文将介绍如何将两个链接列表合并到另一个链接列表的末尾。这个末尾不是直接在列表的结尾,而是在预留的备用位置。这对于需要将两个链接列表合并成一个的场景非常有用。在下面的代码片段中,我们将解释如何实现这个功能。

实现思路

我们将实现一个函数 mergeLinkedLists,该函数接受两个指向链接列表头节点的指针和一个整数值 n。其中,第一个链接列表将会被插入到第二个列表的第 n 个节点之后。

  • 首先,我们需要遍历第二个链接列表直到第 n 个节点。假设我们已经到达第 n 个节点,并且我们有指向此节点的指针。此时,我们需要记录此节点的下一个节点(即原来的第 n+1 个节点),并将此节点的 next 指针指向第一个链接列表的头节点。

  • 接下来,需要遍历第一个链接列表,找到它的尾节点。将新的尾节点的 next 指针指向第二个链接列表中原来的第 n+1 个节点。这样,第一个链接列表就被合并到了第二个列表中。

下面的代码片段详细介绍了如何实现这个函数。

代码实现
#include <iostream>

class Node {
public:
    int data;
    Node* next;

    Node(int data) {
        this->data = data;
        this->next = nullptr;
    }
};

void mergeLinkedLists(Node* list1, Node* list2, int n) {
    if (n < 0) {
        std::cout << "Error: n should be a non-negative integer." << std::endl;
        return;
    }

    Node* current = list2;
    for (int i = 0; i < n && current; i++) {
        current = current->next;
    }

    if (!current) {
        std::cout << "Error: list2 has less than " << n << " nodes." << std::endl;
        return;
    }

    Node* nextNode = current->next;
    current->next = list1;

    while (list1->next) {
        list1 = list1->next;
    }

    list1->next = nextNode;
}
测试代码

我们将创建三个链接列表并测试我们的函数。最后,我们将输出第三个列表的内容,以验证它们是否已成功合并。

int main() {
    // Create linked list 1: 1 -> 2 -> 3 -> 4
    Node* list1 = new Node(1);
    list1->next = new Node(2);
    list1->next->next = new Node(3);
    list1->next->next->next = new Node(4);

    // Create linked list 2: 5 -> 6 -> 7 -> 8 -> 9
    Node* list2 = new Node(5);
    list2->next = new Node(6);
    list2->next->next = new Node(7);
    list2->next->next->next = new Node(8);
    list2->next->next->next->next = new Node(9);

    // Create linked list 3: a -> b -> c
    Node* list3 = new Node('a');
    list3->next = new Node('b');
    list3->next->next = new Node('c');

    // Merge list1 into list2 at position 2
    mergeLinkedLists(list1, list2, 2);

    // Merge list3 into list2 at position 5
    mergeLinkedLists(list3, list2, 5);

    // Print list2
    Node* current = list2;
    while (current) {
        std::cout << current->data << " ";
        current = current->next;
    }
    std::cout << std::endl;

    return 0;
}

输出结果为:

5 6 1 2 3 4 7 8 9 a b c 

这表明将三个列表成功合并到一个列表中,最终的列表中包含了所有节点。