📌  相关文章
📜  用于就地重新排列给定链接列表的 C++ 程序。(1)

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

用于就地重新排列给定链接列表的 C++ 程序

本程序使用C++语言实现,旨在提供一种方法来就地重新排列给定链接列表。

实现思路

本程序使用链表来存储元素,并通过交换节点的位置来实现就地重新排列。

具体实现过程如下:

  1. 定义链表节点结构体Node,包含valuenext成员变量,分别表示节点的值和下一个节点的指针。
  2. 定义链表类LinkedList,包含headtail成员变量,分别表示链表头部和尾部节点的指针。
  3. 实现LinkedList类的reverse函数,用于对链表进行就地重新排列。
  4. reverse函数中,使用三个指针prevcurrnext来遍历链表,并通过交换指针的指向来实现就地重新排列。
代码示例
struct Node{
    int value;
    Node* next;
};

class LinkedList{
public:
    Node* head;
    Node* tail;

    // 构造函数,初始化链表
    LinkedList(){
        head = nullptr;
        tail = nullptr;
    }

    // 就地重新排列链表
    void reverse(){
        Node* prev = nullptr;
        Node* curr = head;
        Node* next = nullptr;

        while(curr != nullptr){
            next = curr->next;
            curr->next = prev;
            prev = curr;
            curr = next;
        }

        head = prev;
    }

    // 添加元素到链表末尾
    void add(int val){
        Node* newNode = new Node;
        newNode->value = val;
        newNode->next = nullptr;

        if(head == nullptr){
            head = newNode;
            tail = newNode;
        }else{
            tail->next = newNode;
            tail = newNode;
        }
    }

    // 输出链表内容
    void print(){
        Node* curr = head;

        while(curr != nullptr){
            std::cout << curr->value << " ";
            curr = curr->next;
        }

        std::cout << std::endl;
    }
};

int main(){
    LinkedList list;

    // 添加测试数据
    list.add(1);
    list.add(2);
    list.add(3);
    list.add(4);

    std::cout << "原始链表:";
    list.print();

    // 对链表进行就地重新排列
    list.reverse();

    std::cout << "重新排列后的链表:";
    list.print();

    return 0;
}
总结

本程序实现了一种使用链表来就地重新排列的方法,将链表中的每个节点的next指针反转即可。通过使用链表,我们可以高效地对任意长度的列表进行重新排列。