这是一个链表追击问题,设2个指针,一个一次走2步,一个一次走一步。
如果有环的话,最终快的指针会追上慢的指针,如果没有环的话,快的指针会首先到达NULL
这里我也有疑问,会不会每次都会跳过去?
#include "stdafx.h"
#include<iostream>
#include<algorithm>
using namespace std;
typedef struct node{
int data;
struct node *next;
}Node,*List;
List createListWithOutHead(int n)//创建不带头结点的循环链表
{
if(n==0)
return NULL;
List head = (List)malloc(sizeof(Node));
head->data = 1;
head->next = NULL;
List p = head;
List q =NULL;
for(int i=2;i<=n;i++)
{
q = (List)malloc(sizeof(Node));
q->data = i;
q->next = NULL;
p->next = q;
p = q;
}
p->next = head;//最后一个指针指向第一个节点
return head;
}
void traverseWithOutHead(List head)//遍历不带头结点的链表
{
if(head == NULL)
return ;
List p = head;
do{
cout<<p->data<<" ";
p = p->next;
}while(p!=head);
cout<<endl;
}
bool judge(List head)//判断一个链表是不是有环的
{
if(head == NULL)
return false;
List first = head->next;//初始化2个指针
List last = head;
while(first!=NULL && first!=last)
{
first = first->next;//first要走2步
if(first!=NULL)
{
first = first->next;
last = last->next;//last走一步
}
}
if(first==NULL)
return false;
else
return true;
}
int main()
{
int N = 20;
List head = createListWithOutHead(N);
traverseWithOutHead(head);
cout<<judge(head);
getchar();
return 0;
}