📜  使用堆栈打印反转链表(1)

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

使用堆栈打印反转链表

在程序开发过程中,我们经常需要使用链表这种数据结构。当需要对链表进行反转操作时,可以使用堆栈来实现。本文将介绍如何使用堆栈来打印反转链表。

链表的定义

在C语言中,可以使用结构体来定义链表,如下所示:

typedef struct Node {
    int data;           // 数据
    struct Node *next;  // 指向下一个节点
} Node;
反转链表

假设已经有一个链表,需要将其反转。可以分别用两个指针p和q指向链表的头和头的下一个节点,每次将q节点插入到p的前面,直到q节点指向NULL,最后将原链表的尾指向p节点即可。如下所示:

Node* reverseList(Node* head) {
    Node *p = head, *q = head->next;
    p->next = NULL;
    while (q) {
        Node *tmp = q->next;
        q->next = p;
        p = q;
        q = tmp;
    }
    return p;
}
打印反转链表

接下来,使用堆栈来打印反转后的链表。先将链表的每个节点压入堆栈中,然后依次弹出并打印节点的值。如下所示:

void printReverseList(Node* head) {
    Node *p = head;
    stack<Node*> st;
    while (p) {
        st.push(p);
        p = p->next;
    }
    while (!st.empty()) {
        cout << st.top()->data << " ";
        st.pop();
    }
    cout << endl;
}
完整代码

最终的完整代码如下所示:

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

typedef struct Node {
    int data;           // 数据
    struct Node *next;  // 指向下一个节点
} Node;

Node* reverseList(Node* head) {
    Node *p = head, *q = head->next;
    p->next = NULL;
    while (q) {
        Node *tmp = q->next;
        q->next = p;
        p = q;
        q = tmp;
    }
    return p;
}

void printReverseList(Node* head) {
    Node *p = head;
    stack<Node*> st;
    while (p) {
        st.push(p);
        p = p->next;
    }
    while (!st.empty()) {
        cout << st.top()->data << " ";
        st.pop();
    }
    cout << endl;
}

int main() {
    Node *head = new Node{1, new Node{2, new Node{3, NULL}}};
    head = reverseList(head);
    printReverseList(head);
    return 0;
}
总结

本文介绍了如何使用堆栈来打印反转链表,详细讲解了链表的反转过程和堆栈的使用方法。同时,给出了完整的演示代码。希望对大家有所帮助。