数据结构 C++反转链表

反转链表

定义节点类型

// 定义节点类型
class Node
{
public:
    Node(int data) : _data(data), next(nullptr) {}

public:
    int _data;
    Node *next;
};

定义链表

// 定义链表
class LinkList
{
public:
    LinkList() : head(nullptr), size(0) {}
    ~LinkList()
    {
        Node *current = head;
        while (current != nullptr)
        {
            Node *next = current->next;
            std::cout << "del is " << current->_data << std::endl;
            delete current;
            current = next;
        }
    }
    void insertAtHead(int data); // 头插法
    void printfList();           // 打印
    void reverseIterative();     // 迭代法反转链表
    void reverseRecursive();     // 递归
    void reverseInsertHead();    // 头插
    void reverseUsingStack();    // 栈
    Node *reverseRecursiveHepler(Node *node);

public:
    Node *head;
    int size;
};

1.迭代反转

// 定义链表
class LinkList
{
public:
    LinkList() : head(nullptr), size(0) {}
    ~LinkList()
    {
        Node *current = head;
        while (current != nullptr)
        {
            Node *next = current->next;
            std::cout << "del is " << current->_data << std::endl;
            delete current;
            current = next;
        }
    }
    void insertAtHead(int data); // 头插法
    void printfList();           // 打印
    void reverseIterative();     // 迭代法反转链表
    void reverseRecursive();     // 递归
    void reverseInsertHead();    // 头插
    void reverseUsingStack();    // 栈
    Node *reverseRecursiveHepler(Node *node);

public:
    Node *head;
    int size;
};

2.递归

// 递归
void LinkList::reverseRecursive()
{
    head = reverseRecursiveHepler(head);
}

Node *LinkList::reverseRecursiveHepler(Node *node)
{
    if (node == nullptr || node->next == nullptr)
    {
        return node;
    }
    Node *newNode = reverseRecursiveHepler(node->next);
    node->next->next = node;
    node->next = nullptr;
    return newNode;
}

3.头插法反转链表

void LinkList::reverseInsertHead()
{
    Node *newHead = nullptr;
    Node *current = head;
    while (current != nullptr)
    {
        Node *temp = current;
        current = current->next;
        temp->next = newHead;
        newHead = temp;
    }
    head = newHead;
}

4.栈

void LinkList::reverseUsingStack()
{
    if (head == nullptr || head->next == nullptr)
    {
        return;
    }

    std::stack<Node *> nodeStack;
    Node *current = head;

    // 压栈时断开节点连接
    while (current != nullptr)
    {
        Node *next = current->next;
        current->next = nullptr; // 断开当前节点的连接
        nodeStack.push(current);
        current = next;
    }

    // 创建哑节点简化操作
    Node dummy(0);
    current = &dummy;

    while (!nodeStack.empty())
    {
        current->next = nodeStack.top();
        nodeStack.pop();
        current = current->next;
    }

    head = dummy.next; // 更新头指针
}

完整代码

#include <iostream>
#include <stack>
// 定义节点类型
class Node
{
public:
    Node(int data) : _data(data), next(nullptr) {}

public:
    int _data;
    Node *next;
};

// 定义链表
class LinkList
{
public:
    LinkList() : head(nullptr), size(0) {}
    ~LinkList()
    {
        Node *current = head;
        while (current != nullptr)
        {
            Node *next = current->next;
            std::cout << "del is " << current->_data << std::endl;
            delete current;
            current = next;
        }
    }
    void insertAtHead(int data); // 头插法
    void printfList();           // 打印
    void reverseIterative();     // 迭代法反转链表
    void reverseRecursive();     // 递归
    void reverseInsertHead();    // 头插
    void reverseUsingStack();    // 栈
    Node *reverseRecursiveHepler(Node *node);

public:
    Node *head;
    int size;
};

// 头插法
void LinkList::insertAtHead(int data)
{
    Node *newNode = new Node(data);
    newNode->next = head;
    head = newNode;
    size++;
}

// 打印
void LinkList::printfList()
{
    Node *current = head;
    std::cout << "Head->";
    while (current != nullptr)
    {
        std::cout << current->_data;
        if (current->next != nullptr)
        {
            std::cout << " -> ";
        }
        current = current->next;
    }
    std::cout << " -> nullptr" << std::endl;
}

// 迭代法反转链表
void LinkList::reverseIterative()
{
    Node *prev = nullptr;
    Node *cur = head;
    Node *next = nullptr;
    while (cur != nullptr)
    {
        next = cur->next;
        cur->next = prev;
        prev = cur;
        cur = next;
    }
    head = prev;
}

// 递归
void LinkList::reverseRecursive()
{
    head = reverseRecursiveHepler(head);
}

Node *LinkList::reverseRecursiveHepler(Node *node)
{
    if (node == nullptr || node->next == nullptr)
    {
        return node;
    }
    Node *newNode = reverseRecursiveHepler(node->next);
    node->next->next = node;
    node->next = nullptr;
    return newNode;
}

// 头插法反转链表
void LinkList::reverseInsertHead()
{
    Node *newHead = nullptr;
    Node *current = head;
    while (current != nullptr)
    {
        Node *temp = current;
        current = current->next;
        temp->next = newHead;
        newHead = temp;
    }
    head = newHead;
}

// 栈
void LinkList::reverseUsingStack()
{
    if (head == nullptr || head->next == nullptr)
    {
        return;
    }

    std::stack<Node *> nodeStack;
    Node *current = head;

    // 压栈时断开节点连接
    while (current != nullptr)
    {
        Node *next = current->next;
        current->next = nullptr; // 断开当前节点的连接
        nodeStack.push(current);
        current = next;
    }

    // 创建哑节点简化操作
    Node dummy(0);
    current = &dummy;

    while (!nodeStack.empty())
    {
        current->next = nodeStack.top();
        nodeStack.pop();
        current = current->next;
    }

    head = dummy.next; // 更新头指针
}

int main()
{
    LinkList *list = new LinkList();

    for (int i = 1; i <= 5; ++i)
    {
        list->insertAtHead(i);
    }

    std::cout << "Original list: ";
    list->printfList();

    // 测试各种反转方法
    std::cout << "\nTesting reverseIterative:\n";
    list->reverseIterative();
    list->printfList();

    std::cout << "\nTesting reverseRecursive:\n";
    list->reverseRecursive();
    list->printfList();

    std::cout << "\nTesting reverseInsertHead:\n";
    list->reverseInsertHead();
    list->printfList();

    std::cout << "\nTesting reverseUsingStack:\n";
    list->reverseUsingStack();
    list->printfList();

    delete list;
    return 0;
}
posted @ 2025-07-15 20:32  杰西卡若  阅读(8)  评论(0)    收藏  举报