直接上代碼:
#include <iostream>
#include <stack>
using namespace std;
#define noloop //choose loop or noloop
//單向鏈表節點
struct ListNode{
int value;
struct ListNode *Next;
};
class MyList
{
public:
ListNode *Head;
public:
MyList(){
Head = new ListNode; //new一個節點
}
~MyList(){
delete Head;
Head = NULL;
}
void CreatList(int n);
void ergodic();
void insert(int location,int num);
void delete_node(int serial);
void ergodic_convert();
void convert_node();
//環操作成員函數
void CreatLoopList(int n);
bool isexsistloop();
int getlooplenth();
};
void MyList::CreatList(int n){
ListNode *P= Head;
for(int i=1;i<=n;i++){
ListNode *Temp = new ListNode;
cin>>Temp->value;
P->Next = Temp;
Temp->Next = NULL;
P = Temp;
}
}
void MyList::CreatLoopList(int n){
ListNode *P= Head;
for(int i=1;i<=n;i++){
ListNode *Temp = new ListNode;
cin>>Temp->value;
P->Next = Temp;
if(i==n){
Temp->Next = Head->Next->Next;
}else
Temp->Next = NULL;
P = Temp;
}
}
void MyList::ergodic(){
ListNode *P= Head;
P =P->Next;
cout<<"遍歷: ";
while(P!=NULL){
cout<<P->value<<" ";
P =P->Next;
}
cout<<endl;
}
void MyList::insert(int location,int num){
ListNode *P= Head;
while(location--){
P= P->Next;
}
ListNode *Temp = new ListNode;
Temp->value = num;
Temp->Next = P->Next;
P->Next = Temp;
}
void MyList::delete_node(int serial){
ListNode *P= Head;
if(serial<1)
return;
serial--;
while(serial--){
P= P->Next;
}
P->Next = P->Next->Next;
}
void MyList::ergodic_convert(){
ListNode *P= Head;
stack<ListNode*>volum;
//stack<ListNode*>::iterator iter;
if(P==NULL||P->Next==NULL){
return;
}
while(P->Next!=NULL){
P= P->Next;
volum.push(P);
}
cout<<"反向遍歷: ";
while(!volum.empty()){
ListNode *v = volum.top();
cout<<v->value<<" ";
volum.pop();
}
cout<<endl;
}
void MyList::convert_node(){
ListNode *P= Head;
stack<ListNode*>volum;
if(P==NULL||P->Next==NULL){
return;
}
while(P->Next!=NULL){
P= P->Next;
volum.push(P);
}
ListNode *R = Head;
ListNode *Temp=R;
while(!volum.empty()){
ListNode *v = volum.top();
Temp->Next = v;
v->Next = NULL;
Temp = v;
volum.pop();
}
}
bool MyList::isexsistloop(){
ListNode *fast = Head;
ListNode *slow = Head;
while(fast && fast->Next){
slow = slow->Next;
fast = fast->Next->Next;
if(fast == slow)
break;
}
return !(fast==NULL||fast->Next==NULL);
}
int MyList::getlooplenth(){
ListNode *fast = Head;
ListNode *slow = Head;
while(fast && fast->Next){
slow = slow->Next;
fast = fast->Next->Next;
if(fast == slow) //第一次相遇
break;
}
slow = slow->Next;
fast = fast->Next->Next;
int len=1;
//再次相遇就是環的長度
while(slow!=fast){
slow = slow->Next;
fast = fast->Next->Next;
len++;
}
return len;
}
int main ()
{
MyList *mylist = new MyList; //自己定義一個對象
cout<<"創建鏈表個數:";
int n;
cin>>n;
#ifdef noloop //環操作
mylist->CreatList(n);
mylist->insert(2,999);
mylist->insert(3,444);
mylist->delete_node(1);
mylist->ergodic();
mylist->ergodic_convert();
mylist->convert_node();
cout<<"反轉後";
mylist->ergodic();
#endif
#ifdef loop //環操作
mylist->CreatLoopList(n);
cout<<"是否存在loop : "<<mylist->isexsistloop()<<endl;
cout<<"loop的長度 : "<<mylist->getlooplenth()<<endl;
#endif
delete mylist;
mylist = NULL;
return 0;
}