📅  最后修改于: 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;
}
本文介绍了如何使用堆栈来打印反转链表,详细讲解了链表的反转过程和堆栈的使用方法。同时,给出了完整的演示代码。希望对大家有所帮助。