劍指offer之找到鏈表里面包含環(huán)的入口節(jié)點(diǎn)
1 問(wèn)題
劍指offer之找到鏈表里面包含環(huán)的入口節(jié)點(diǎn),比如
// node7<-node6 <-node5
// | |
//head->node1->node2->node3->node4
環(huán)的入口節(jié)點(diǎn)是node2
2 代碼實(shí)現(xiàn)
#include <stdio.h>
#include <stdlib.h>
#define true 1
#define false 0
typedef struct node
{
int value;
struct node *next;
} Node;
/**
*得到環(huán)的第一個(gè)公共節(jié)點(diǎn)
*/
Node *getCommonNode(Node *head)
{
if (head == NULL)
{
return NULL;
}
Node *first = NULL;
Node *second = NULL;
first = head;
second = head;
int isCircle = false;
//判斷是否有環(huán)
while (second != NULL && (second->next) != NULL && (second->next->next != NULL))
{
first = first->next;
second = second->next->next;
if (first == second)
{
isCircle = true;
break;
}
}
if (isCircle == false)
{
printf("the list do not circle\n");
return NULL;
}
//判斷環(huán)的大小,這個(gè)時(shí)候肯定是進(jìn)到環(huán)里面去了
int len = 0;
first = first->next;
++len;
while (first != second)
{
len++;
first = first->next;
}
//求出入口節(jié)點(diǎn)
Node *start = head;
Node *end = head;
while (len-- > 0)
{
end = end->next;
}
while (start != end)
{
start = start->next;
end = end->next;
}
return start;
}
int main()
{
Node *head = NULL;
Node *node1 = NULL;
Node *node2 = NULL;
Node *node3 = NULL;
Node *node4 = NULL;
Node *node5 = NULL;
Node *node6 = NULL;
Node *node7 = NULL;
head = (Node *)malloc(sizeof(Node));
node1 = (Node *)malloc(sizeof(Node));
node2 = (Node *)malloc(sizeof(Node));
node3 = (Node *)malloc(sizeof(Node));
node4 = (Node *)malloc(sizeof(Node));
node5 = (Node *)malloc(sizeof(Node));
node6 = (Node *)malloc(sizeof(Node));
node7 = (Node *)malloc(sizeof(Node));
if (head == NULL || node1 == NULL || node2 == NULL || node3 == NULL
|| node4 == NULL || node5 == NULL || node6 == NULL || node7 == NULL)
{
printf("malloc fail\n");
return false;
}
// node7<-node6 <-node5
// | |
//head->node1->node2->node3->node4
head->value = 0;
head->next = node1;
node1->value = 1;
node1->next = node2;
node2->value = 2;
node2->next = node3;
node3->value = 3;
node3->next = node4;
node4->value = 4;
node4->next = node5;
node5->value = 5;
node5->next = node6;
node6->value = 6;
node6->next = node7;
node7->value = 7;
node7->next = node2;
Node *result = getCommonNode(head);
if (result != NULL)
{
printf("the first common value is %d\n", result->value);
}
else
{
printf("list do not have circle\n");
}
return true;
}
3 運(yùn)行結(jié)果
the first common value is 2
作者:chen.yu
深信服三年半工作經(jīng)驗(yàn),目前就職游戲廠商,希望能和大家交流和學(xué)習(xí),
微信公眾號(hào):編程入門(mén)到禿頭 或掃描下面二維碼
零基礎(chǔ)入門(mén)進(jìn)階人工智能(鏈接)