1.分析单链表是否带环
2.带环链表环的长度分析
3.求环入口点分析
具体代码如下:
1.hpp文件
#pragma once
#include
typedef struct ListNode{
int value;
ListNode* next;
}node,*pnode;
pnode createNode(int data)
{
pnode temp = new node();
temp->value = data;
temp->next = NULL;
return temp;
}
void InitList(pnode* pHead)
{
*pHead = NULL;
}
void pushNode(pnode* pHead, int data)
{
if (*pHead == NULL)
{
*pHead = createNode(data);
}
else
{
pnode tmp = *pHead;
while (NULL != tmp->next)
{
tmp = tmp->next;
}
tmp->next = createNode(data);
}
}
void Print(pnode pHead)
{
pnode tmp = pHead;
while (tmp)
{
printf("%d->",tmp->value);
tmp = tmp->next;
}
printf("NULL");
}
void MakeLoopList(pnode* pHead)
{
pnode tem = *pHead;
while (tem->next)
{
tem = tem->next;
}
tem->next = *pHead;
}
bool isHaveLoop(pnode pHead)
{
if (NULL == pHead)
{
return false;
}
pnode first = pHead;
pnode second = pHead;
while (NULL != second && NULL != second->next)
{
first = first->next;
second = second->next->next;
if (first == second)
{
return true;
}
}
return false;
}
int LoopLength(pnode pHead)
{
int count = 0;
if (NULL == pHead)
{
return 0;
}
pnode first = pHead;
pnode second = pHead;
while (NULL != first && NULL != first->next)
{
first = first->next;
second = second->next->next;
if (first == second)
{
count++;
first = first->next;
while (first != second)
{
first = first->next;
count++;
}
return count;
}
}
return 0;
}
pnode FindLoopNode(pnode pHead)
{
if (NULL == pHead)
{
return pHead;
}
pnode f = pHead;
pnode s = pHead;
while (NULL != f)
{
f = f->next;
s = s->next->next;
if (f == s)
{
break;
}
}
pnode p = pHead;
while (f != p)
{
f = f->next;
p = p->next;
}
return p;
}
主函数
#include "1.hpp"
int main()
{
pnode n;
InitList(&n);
pushNode(&n, 1);
pushNode(&n, 2);
pushNode(&n, 3);
pushNode(&n, 4);
pushNode(&n, 5);
pushNode(&n, 6);
Print(n);
printf("\n");
MakeLoopList(&n);
printf("%d\n", isHaveLoop(n));
printf("%d\n", LoopLength(n));
printf("%d\n", FindLoopNode(n)->value);
return 0;
}