先定一个小目标,比如说先实现一个反转单链表
大致思路:将第一个(存在)节点之后的节点依次插入head之后
#include<iostream>
using namespace std;
class ListNode{
public:
int info;
ListNode* next;
ListNode(){
next=0;
}
ListNode(int info123,ListNode* next123){
next=next123;
info=info123;
}
};
typedef ListNode* ListType;
class List{
ListType head;
ListType tail;
public:
List(){
head=new ListNode;
tail=head;
}
~List(){
ListType ptr=head->next;
while(ptr){
ListType d=ptr;
ptr=ptr->next;
delete(d);
}
delete head;
//cout<<"Byebye"<<endl;
}
ListType getHead(){
return head;
}
bool insert(int index,int info){
ListType ptr=head;
for(int i=0;i<index;i++){
if (ptr->next)
ptr=ptr->next;
else{
cout<<"error index"<<endl;
return false;}
}
if(ptr==tail){
tail=new ListNode(info,0);
ptr->next=tail;
}
else{
ListType newone=new ListNode(info,ptr->next);
ptr->next=newone;
}
}
void traverse(){
ListType ptr=head->next;
while(ptr){
cout<<ptr->info<<' ';
ptr=ptr->next;
}
cout<<endl;
}
void Init(){
ListType ptr=head->next;
while(ptr){
ListType d=ptr;
ptr=ptr->next;
delete(d);
}
ptr=head;
for (int i=1,j=2;i<50;j=j+i,i=j-i){
ptr->next=new ListNode(j,0);
ptr=ptr->next;
}
}
};
void reverse1(List& srcList,List& desList){
//头插法创建一个链表
ListType head=srcList.getHead();
if(head==0) return;
ListType ptr=head->next;
while(ptr){
desList.insert(0,ptr->info);
ptr=ptr->next;
}
}
void reverse2(List& srcList){
//就地反转,将tail节点之后的节点放到head之后
ListType head=srcList.getHead();
if(head==0) return;
ListType tail=head->next;
if (tail==0) return;
tail=tail->next;
head->next->next=0;
ListType ptr;
while(tail){
ptr=tail;
tail=tail->next;
ptr->next=head->next;
head->next=ptr;
}
}
void reverse_inside(ListType &head,ListType &node){
if (node){
ListType rear=node->next;
node->next=head->next;
head->next=node;
reverse_inside(head,rear);
}
}
void reverse3(List& srcList){
ListType head=srcList.getHead();
if(head==0) return;
ListType firstnode=head->next;
head->next=0;
reverse_inside(head,firstnode);
}
int main(){
List srcList;
srcList.Init();
cout<<"origin string"<<endl;
srcList.traverse();
cout<<"StrReverse version 1"<<endl;
List rev1;
reverse1(srcList,rev1);
rev1.traverse();
cout<<"StrReverse version 2"<<endl;
reverse2(srcList);
srcList.traverse();
srcList.Init();
cout<<"StrReverse version 3"<<endl;
reverse3(srcList);
srcList.traverse();
return 0;
}