📜  以之字形方式重新排列链表的 C++ 程序(1)

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

以之字形方式重新排列链表的 C++ 程序

这篇文章将介绍如何编写一个 C++ 程序以将链表重新排列为之字形方式。之字形方式是指从上到下交替的从左到右和从右到左两个方向。

思路

我们将使用两个栈,一个保存从左到右的顺序的节点,另一个保存从右到左顺序的节点。我们遍历链表,并将节点交替存储在这两个栈中,最后从这两个栈中依次弹出节点并连接它们。

代码
#include <iostream>
#include <stack>
using namespace std;

struct Node {
    int data;
    Node* next;
};

void reorderList(Node* head) {
    if (head == nullptr || head->next == nullptr) {
        return;
    }

    stack<Node*> leftStack;
    stack<Node*> rightStack;

    Node* cur = head;
    while (cur) {
        leftStack.push(cur);
        cur = cur->next;

        if (cur) {
            rightStack.push(cur);
            cur = cur->next;
        }
    }

    Node* newHead = leftStack.top();
    cur = newHead;
    leftStack.pop();

    while (!leftStack.empty() || !rightStack.empty()) {
        if (!rightStack.empty()) {
            cur->next = rightStack.top();
            cur = cur->next;
            rightStack.pop();
        }

        if (!leftStack.empty()) {
            cur->next = leftStack.top();
            cur = cur->next;
            leftStack.pop();
        }
    }

    cur->next = nullptr;
    head = newHead;

    while (head) {
        cout << head->data << " ";
        head = head->next;
    }
}

int main() {
    Node* n1 = new Node{1, nullptr};
    Node* n2 = new Node{2, nullptr};
    Node* n3 = new Node{3, nullptr};
    Node* n4 = new Node{4, nullptr};
    Node* n5 = new Node{5, nullptr};

    n1->next = n2;
    n2->next = n3;
    n3->next = n4;
    n4->next = n5;

    reorderList(n1);

    return 0;
}
示例

使用这个程序对链表 1->2->3->4->5 进行重新排列,结果是 1->5->2->4->3:

1 5 2 4 3
结论

这个程序通过使用两个栈并遍历链表来重新排列链表成为之字形方式。它是一个简单但有用的技术,适用于许多实际情况中。