首先要判断链表是否有环,如果有环的话,要判断环的入口节点。
#include <stdio.h>
#include <malloc.h>
#define N 9
struct listNode
{
int value;
struct listNode* next;
listNode(int v = 0, listNode* ne = NULL)
{
value = v;
next = ne;
}
};
void print(listNode*);
listNode* getMiddleNode(listNode* head)
{
if (head == NULL || head->next == NULL || head->next->next == NULL)
{
return head;
}
listNode* fastNode = head; //if N = 10 and code:listNode* fastNode = head->next; ,then we will get the sixth.
listNode* slowNode = head;
while (fastNode && fastNode->next) //bug here!!! last writen:while(fastNode->next && fastNode->next->next)
{
fastNode = fastNode->next->next;
slowNode = slowNode->next;
if (fastNode == slowNode)
break;
}
if (!fastNode || !fastNode->next)
{
return slowNode;
} //从此以后fastNode每一次走一步。
int length = 0;
for (fastNode=head/**attention!**/; fastNode!=slowNode;fastNode=fastNode->next,slowNode=slowNode->next)
length++;
listNode* firstCommonNode =fastNode;
length++;
for (fastNode = fastNode->next; fastNode!=firstCommonNode;fastNode=fastNode->next)
length++;
fastNode=head;
for (int i = 0; i < length / 2;i++)
{
fastNode=fastNode->next;
}
return fastNode;
}
void test(bool roll)
{
listNode* head = (listNode*)malloc(sizeof listNode);
head->value = 0;
listNode* p = head;
for (int i = 1; i < N; i++)
{
listNode* q = (listNode*)malloc(sizeof listNode);
q->value = i;
p->next = q;
p = q;
}
if (roll)
{
int n;
printf("please enter the number of the roll:");
scanf("%d",&n);
listNode* m = head;
for (int i = 0; i < N-n;i++)
{
m = m->next;
}
p->next=m;
}
else
p->next=NULL;
//print(head);
listNode* middle = getMiddleNode(head);
printf("The middle node we get is : %d\n",middle->value);
}
void print(listNode* head)
{
int curIndex = 1;
while (head)
{
printf("The %d node's value is : %d\n",curIndex++,head->value);
head=head->next;
}
}
int main()
{
test(true);
return 1;
}