借助栈实现单链表的原地逆置
【问题描述】首先建立一个单链表,通过栈实现该链表的原地逆置,注意仅使用链表中的原有的结点空间,结点的数据成员为int型。注意这个题需要单链表和栈两个类。
【输入形式】输入只有一行,依次输入若干个整数,整数之间用一个空格分开,最后以-1结束,用表尾添加结点的方法建立一个单链表。
【输出形式】输出有2行,第1行为原链表数据,第2行为逆置后的链表数据,具体格式见样例输出
【样例输入】
1 2 3 4 5 -1
【样例输出】
1–>2–>3–>4–>5
5–>4–>3–>2–>1
代码如下:
#include<iostream>
using namespace std;
struct LinkNode
{
int data;
LinkNode* link;
LinkNode()
{
link = NULL;
}
LinkNode(int x)
{
data = x;
link = NULL;
}
};
class LinkList
{
public:
LinkList()
{
head = new LinkNode;
}
~LinkList()
{
}
void creat()
{
int num = -1;
LinkNode* NewNode = NULL, * current = head;
while (cin >> num && num != -1)
{
NewNode = new LinkNode(num);
current->link = NewNode;
current = NewNode;
}
}
LinkNode* get_head()
{
return head;
}
void display()
{
LinkNode* p = head->link;
while (p->link != NULL)
{
cout << p->data << "-->";
p = p->link;
}
cout << p->data << endl;
}
private:
LinkNode* head;
};
class Stack
{
public:
Stack()
{
top = NULL;
}
~Stack()
{
}
void all_push(LinkNode* T)
{
top = T;
LinkNode* current=T->link;
while (current != NULL)
{
T = current;
current = T->link;
T->link = top;
top = T;
}
}
void all_pop(LinkNode* head)
{
while (top->link != head)
{
cout << top->data << "-->";
top = top->link;
}
cout << top->data << endl;
}
private:
LinkNode* top;
};
void change(LinkList& s,Stack& temp)
{
LinkNode* t = s.get_head();
temp.all_push(t);
temp.all_pop(t);
}
int main()
{
LinkList s;
s.creat();
s.display();
Stack temp;
change(s,temp);
return 0;
}