《面試準備》C++鏈表操作1(包含鏈表的創建、插入刪除、遍歷、反轉、判斷是否有環、環的長度)

直接上代碼:

#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;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章