1.循环链表的特点是收尾相接,没有头指针,也没有尾指针。如果去遍历循环链表,则是死循环。
2.这里判断循环链表的方法是; 用两个指针,一个指针是块指针(跳一个节点遍历),遍历快(p=p->netxt->next),一个指针逐步遍历,慢指针。
如果在遍历当中,如果发现这两个指针有可能是出现NULL指针的话,那边它是单链表。否则是单链表(本来这个证明已经够了,但如何让死循环的函数停止,给我们一个返回一个循环链表的结构呢?这里的方法是:如果在循环链表中,慢指针一定可能和快指针重叠,(类似于运动员超跑一样)。
typedef struct node
{
int data;
struct node *next;
}Node,*pnode;
int is_Clink( pnode p)
{
pnode fastpoint,slowpoint;
fastpoint=p;
slowpoint = p;
while(1)
{
if(slowpoint==NULL||fastpoint==NULL)
printf("This is linklist\n");
return 1
slowpoint=slowpoint->next;
fastpoint=fastpoint->next->next;
if (slowpoint==fastpoint||fastpoint->next==slowpoint)
printf("The si Clink\n");
return 0;
}
}
/*做一个小改进,优化一下代码结构如下:*/
int is_Clink( pnode p)
{
pnode fastpoint,slowpoint;
fastpoint=p;
slowpoint = p;
while(slowpoint &&fastpoint)
{
slowpoint=slowpoint->next;
fastpoint=fastpoint->next->next;
if (slowpoint==fastpoint||fastpoint->next==slowpoint)
printf("The si Clink\n");
return 0;
}
printf("This is linklist\n");
return 1
}
本文详细介绍了循环链表的特性和检测方法,通过使用快慢指针技巧有效地识别循环链表,并优化了代码结构以提高效率。此外,文章还提供了一个改进的循环链表检测函数,确保在复杂场景下也能准确判断。
3516

被折叠的 条评论
为什么被折叠?



