#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct ListNode {
int val;
struct ListNode *next;
};
struct ListNode *detectCycle(struct ListNode *head) {
struct ListNode *quickNode = head, *slowNode = head;
do {
if (!quickNode || !slowNode || !quickNode->next || !quickNode->next->next) {
return NULL;
}
quickNode = quickNode->next->next;
slowNode = slowNode->next;
} while(quickNode != slowNode);
slowNode = head;
while (slowNode != quickNode) {
slowNode = slowNode->next;
quickNode = quickNode->next;
}
return quickNode;
}
struct ListNode* createList(int* values, int len){
int i = 0;
struct ListNode *head = NULL, *tail = NULL, *node = NULL;
if(!values || len==0) {
return NULL;
}
for (i = 0; i < len; i++) {
node = (struct ListNode*)malloc(sizeof(struct ListNode));
if(!node) {
exit(1);
}
node->val = values[i];
node->next = NULL;
if(!head){
head = node;
tail = head;
}else{
tail->next = node;
tail = node;
}
}
tail->next = head->next;
return head;
}
void printList(struct ListNode* head,char* msg){
struct ListNode* node = head;
int i = 0;
if (msg){
printf("%s:",msg);
} else {
printf("list:");
}
while (node) {
printf("%d ",node->val);
node = node->next;
}
printf("\r\n");
}
int main(){
struct ListNode* head = NULL;
int values[]={3,2,0,-4};
head = createList(values,sizeof(values)/sizeof(values[0]));
printf("val:%d\r\n",detectCycle(head)->val);
}