判斷單鏈表是否有環、環長多少、入點爲何、鏈表總長?C++實現

Q1.單鏈表是否有環?

Q2.環長多少?

Q3.入點爲何?

Q4.鏈表總長?

 

A1.設置快慢指針,一個走兩步、一個走三步,同時前進,如果二者相遇則有環,如果某一個指針遇到NULL則無環

A2.在快慢指針相遇後,二者再繼續遍歷鏈表,直至二者指針重合,所經過的長度爲環長

A3.從二者的重合點和head指針處開始遍歷,直到二者重合便爲環的入點

A4.將A2,A3統計的數據相加即可

 

代碼如下:

#include <cstdlib>
#include <iostream>

using namespace std;

typedef struct LinkNode {
    int value;
    struct LinkNode *next;
} link;

bool panhuan (link* head) {
    link *fastPtr = head;
    link *slowPtr = head;

    bool flag = true;
    while (fastPtr != slowPtr || flag) {
        flag = false;
        if (fastPtr == NULL || slowPtr == NULL) return false;
        fastPtr = fastPtr->next->next;
        slowPtr = slowPtr->next;
    }

    return true;
}

int huanChang (link *head) {
    link *fastPtr = head;
    link *slowPtr = head;

    bool flag = true;
    while (fastPtr != slowPtr || flag) {
        flag = false;
        if (fastPtr == NULL || slowPtr == NULL) return false;
        fastPtr = fastPtr->next->next;
        slowPtr = slowPtr->next;
    }

    int length = 1;
    fastPtr = fastPtr->next->next;
    slowPtr = slowPtr->next;
    while (fastPtr != slowPtr) {
        fastPtr = fastPtr->next->next;
        slowPtr = slowPtr->next;
        length++;
    }
    return length;
}

int InNode (link* head) {
    link *fastPtr = head;
    link *slowPtr = head;

    bool flag = true;
    while (fastPtr != slowPtr || flag) {
        flag = false;
        if (fastPtr == NULL || slowPtr == NULL) return false;
        fastPtr = fastPtr->next->next;
        slowPtr = slowPtr->next;
    }
    while (head != slowPtr) {
        head = head->next;
        slowPtr = slowPtr->next;
    }
    return head->value;
}

void print (link *head) {
    head = head->next;
    bool flag = false;
    while (1) {
        if (flag && head->value == 2) return;
        else {
            cout << head->value << " ";
            if (head->value == 2) flag = true;

            head = head->next;
        }
    }
}

int main ()
{
    // create link
    link *head = (link*) malloc (sizeof (link));
    head->next = (link*) malloc (sizeof (link));
    head->next->next = (link*) malloc (sizeof (link));
    head->next->next->next = (link*) malloc (sizeof (link));
    head->next->next->next->next = (link*) malloc (sizeof (link));
    head->next->next->next->next->next = (link*) malloc (sizeof (link));
    head->next->next->next->next->next->next = (link*) malloc (sizeof (link));
    head->next->next->next->next->next->next->next = (link*) malloc (sizeof (link));

    head->next->value = 1;
    head->next->next->value = 2;
    head->next->next->next->value = 3;
    head->next->next->next->next->value = 4;
    head->next->next->next->next->next->value = 5;
    head->next->next->next->next->next->next->value = 6;
    head->next->next->next->next->next->next->next->value = 7;

    head->next->next->next->next->next->next->next->next = head->next->next;

    if (panhuan (head)) {
        cout << "Have Hoop " << endl;
        cout << "Length of Hoop is : " << huanChang (head) << endl;
        cout << "In Hoop point value is : " << InNode (head) << endl;
        cout << "sum length is : " << InNode (head) + huanChang (head) - 1 << endl;
    } else {
        cout << "No Hoop" << endl;
    }

    //print (head);
}

 

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