您的位置:首页 > 其它

单链表判断是否带环,环的接入点

2015-07-16 10:19 169 查看
1、是否带环判断:使用追赶的方法,设定两个指针slow、fast,从头指针开始,每次分别前进1步、2步。如存在环,则两者相遇;如不存在环,fast遇到NULL退出。

2、环的接入点:碰撞点p到连接点的距离=头指针到连接点的距离,因此,分别从碰撞点、头指针开始走,相遇的那个点就是连接点。

//判断单链表是否带环
bool FindListTail(PList &head, PList &hNode)
{
Node *slow, *fast;
slow = fast= head;
while(fast != NULL&&fast->_next !=NULL)
{
fast = fast->_next->_next;
slow = slow->_next;
if(fast == slow)
{
hNode=fast;
return true;
}
}
return false;
}
//环的接入点
Node *findLoopPort(PList head)
{

if(head == NULL || head->_next == NULL)
return NULL;
Node *slow,*fast;
slow = fast = head;
while(fast != NULL && fast->_next != NULL)
{
fast = fast->_next->_next;
slow = slow->_next;
if(fast == slow)
break;
}
if(fast != slow)
return NULL;
fast = head;
while(fast != slow)
{
fast = fast->_next;
slow = slow->_next;
}
return fast;
}
//查找节点
Node* Find(PList head, DataType x)
{
Node* tail = head;
while (tail != NULL)
{
if (x == tail->_data)
{
return tail;
}
tail = tail->_next;
}
cout << "NULL" << endl;
return NULL;
}
//单链表
void Test11()
{
PList list;
list = NULL;
PushBack(list, 1);
PushBack(list, 2);
PushBack(list, 3);
PushBack(list, 4);
PushBack(list, 5);
PushBack(list, 6);
PushBack(list, 7);
PushBack(list, 8);

Node *cur = Find(list,5);
Node *lcur= Find(list,8);
lcur->_next=cur;

Node *hNode = NULL;
int ret = FindListTail(list,hNode);
cout<<ret<<endl;

Node *ret1 = findLoopPort(list);
cout<<ret1->_data<<endl;
}
int main()
{
Test11();
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: