题目:创建一个链表,从尾到头打印链表。
三种方法:利用栈, 递归, 就地逆置
#include <iostream>
#include <stack>
using namespace std;
template <class T>
struct Node
{
T data;
Node<T> *next;
};
template <class T>
void Create(Node<T>* &head, T a[], int n)
{
Node<T> *s, *p;
int flag = 1; //标记头结点
for (int i=0; i<n; i++)
{
s = new Node<T>;
s->data = a[i];
if (flag)
{
head = s;
flag = 0;
p = s;
}
else
{
p->next = s;
p = s;
}
}
p->next = NULL;
}
template <class T>
void Reverse1(Node<T> *head) //先遍历链表将元素存入栈,再输出
{
stack<T> s;
while(head)
{
s.push(head->data);
head = head->next;
}
while(!s.empty())
{
cout << s.top() << " ";
s.pop();
}
}
template <class T>
void Reverse2(Node<T> *head) //递归
{
if (head)
{
Reverse2(head->next);
cout << head->data << " ";
}
}
template <class T>
void Reverse3(Node<T>* &head) //就地逆置链表(破坏了链表结构)
{
Node<T> *q = NULL, *p = head, *s = head;
while (s)
{
s = s->next;
p->next = q;
q = p;
p = s;
}
head = q;
}
template <class T>
void Show(Node<T> *head)
{
while (head)
{
cout << head->data << " ";
head = head->next;
}
}
template <class T>
void Release(Node<T> *head)
{
Node<T> *p;
while(head)
{
p = head;
head = head->next;
delete p;
}
}
int main ()
{
int a[] = {0, 1, 2, 3, 4, 5, 6};
int n = sizeof(a)/sizeof(int);
Node<int> *head = NULL;
Create(head, a, n);
Reverse1(head);
Reverse2(head);
Reverse3(head);
Show(head);
Release(head);
return 0;
};