#include<iostream>
using namespace std;
template<class T>
struct ListNode
{
T Data;
ListNode* Flink;
ListNode() { Flink = NULL; }
ListNode(T SHData, ListNode<T>* SHFlink = NULL)
{
Data = SHData;
Flink = SHFlink;
}
};
template<class T>
class SHClass
{
public:
ListNode<T>* Head;
SHClass();
void SHAddNode(T SHData);
ListNode<T>* ReverseList(ListNode<T>* Head);
};
template<class T>
SHClass<T>::SHClass()
{
this->Head = NULL;
}
template<class T>
void SHClass<T>::SHAddNode(T data)
{
ListNode<T> *NewNode = NULL;
if (Head == NULL)
{
NewNode = new ListNode<T>(data, Head);
Head = NewNode;
}
else
{
ListNode<T> *lptr = Head;
while (lptr->Flink != NULL)
{
lptr = lptr->Flink;
}
NewNode = new ListNode<T>(data, lptr->Flink);
lptr->Flink = NewNode;
}
}
template<class T>
ListNode<T>* SHClass<T>::ReverseList(ListNode<T>* head)
{
ListNode<T>* p = NULL; //Blink Node
ListNode<T>* r = head; //Current Node
ListNode<T>* q = NULL; //Flink Node
while (r != NULL)
{
q = r->Flink; //The Flink Node
r->Flink = p; //Reverse!
p = r; //For Next Cycle
r = q; //For Next Cycle
}
return p;
}
int main()
{
SHClass<int> a;
a.SHAddNode(1);
a.SHAddNode(2);
a.SHAddNode(3);
ListNode<int> *lptr;
lptr = a.Head;
while (lptr != NULL)
{
cout << lptr->Data;
lptr = lptr->Flink;
}
cout << endl;
a.Head = a.ReverseList(a.Head);
lptr = a.Head;
while (lptr != NULL)
{
cout << lptr->Data;
lptr = lptr->Flink;
}
return 0;
}