#ifndef _SLIST_H
#define _SLIST_H
#include <iostream>
using namespace std;
template<class T>
struct Node
{
T data;
Node* next;
Node(T data):data(data),next(0){}
~Node(){next=0;}
};
template<class T>
class Slist
{
public:
Node<T>* head;
Slist()
{
head = new Node<T>(0);
}
~Slist()
{
}
//头插法
void insert(T data)
{
Node<T>* node = new Node<T>(data);
Node<T>* pnode = head->next;
head->next = node;
node->next = pnode;
}
//打印单链表
void print(const string& s)
{
cout << s << endl;
Node<T>* p = head->next;
while(p)
{
cout << p->data << "\t";
p = p->next;
}
cout << endl;
}
//单链表反转
void reverse()
{
//如果链表为空,直接返回
if(head->next==NULL) return;
Node<T> *p,*q,*r;
//第一个节点
p = head->next;
//第二个节点
q = p->next;
//第一个节点为新的末尾节点
p->next = NULL;
//遍历,各个节点的next指针反转
while(q)
{
r = q->next;
q->next = p;
p = q;
q = r;
}
//新的第一个节点为原末尾节点
head->next = p;
}
};
#endif
#include<iostream>
#include<string.h>
#include "slist.h"
using namespace std;
int main(int argc,char* argv[])
{
Slist<int> s;
s.insert(5);
s.insert(7);
s.insert(8);
s.insert(16);
s.insert(2);
s.print("原链表:");
s.reverse();
s.print("反转后:");
return 0;
}