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