如何判断一个不知道大小的链表是不是循环链表
算法: 假设已知头节点指针为head
算法1:
listnode *p = head
while(p!=null)
{
p=p->next;
if(p==head)
{
print("是循环链表");
break;
}
}
if(p==null) {print("是普通链表");}
如果链表只有非循环和循环两种的话,这是没问的,但是,极端情况下有可能会出现形如"6"这样的链表,这样,就会造成循环。如何解决,我想了一下,觉得可行的有两个方案。
算法2: 用每个节点中的data域放一标志位,初值为0,访问是做++,第二次方问某个节时就能知道,并可以判断出环。但考虑几个问题,改造链表的存储结构,是不明智的举动,很可能不被允许,而且专门创建这样的链表也不符合通用性要求,于是有了算法3
算法3:
listnode *p = head;
int count = -1;
listnode *q = head;
while(p!=null)
{
p = p->next;
if(p==head) {print("是循环链表"); break;}
else if(p==q) {print("是存在环的链表"); break;}
count++;
if(count)
{
q=q->next;
count=-1;
}
}if(p==null) print("是普通链表");
分析:用指针p来遍历链表,而q以1/2的速度遍历链表。如果存在大环,p总能在足够长的时间先到头节点(这时为循环链表)或追上q(此时链表中存在环)