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