原理图如上:主要思路是割裂,从前到后有层次的逆置,先逆置12,此时3456...都被割裂开了,然后将3连同逆置,一直这样下去。
头文件如下:
链表类的声明
#include<bits/stdc++.h>
using namespace std;
template<class T>
struct Node
{
T data;
struct Node<T>*next;
};
template<class T>
class Linklist
{
public:
Linklist(){front=new Node<T>;front->next=NULL;}//无参构造函数
Linklist(T a[],int n);//有参构造函数
void Printlist();
~Linklist();
void reverse();
private:
Node<T>*front;
};
template<class T>
Linklist<T>::Linklist(T a[],int n)
{
front=new Node<T>;
Node<T>*r=front;
for(int i=0;i<n;i++)
{
Node<T>*s=new Node<T>;
s->data=a[i];
r->next=s;
r=s;
}
r->next=NULL;
}
template<class T>
Linklist<T>::~Linklist()
{
Node<T>*p=front;
while (p)
{
Node<T>*q=p;
p=p->next;
delete q;
q=NULL;
}
}
template<class T>
void Linklist<T>::Printlist()
{
Node<T>*s=front->next;;
while(s!=NULL)
{
cout<<s->data<<" ";
s=s->next;
}
}
主函数如下:
#include<bits/stdc++.h>
#include"Linklist.h"
//逆置算法
template<class T>
void Linklist<T>::reverse()
{
Node<T>*p,*q;
if(front->next&&front->next->next)
{
p=front->next;
q=p->next;
p->next=NULL;
while(q)
{
p=q;
q=q->next;
p->next=front->next;
front->next=p;
}
}
}
using namespace std;
int main()
{
int a[10]={2,0,0,3,0,7,1,4};
Linklist<int>list(a,8);
cout<<"初始表:";
list.Printlist();
cout<<endl;
list.reverse();
cout<<"逆置表:";
list.Printlist();
}