已知链表中可能存在环,若有环返回环起始节点,否则返回NULL
。
如图:
方法一:使用set
求环起始节点
- 遍历链表,将链表中节点对应的指针(地址)插入
set
中;
- 在遍历时插入节点前,需要在
set
中查找,第一个在set
中发现的节点地址即为链表环的起点。
ListNode* detectCycle(ListNode* head)
{
set<ListNode*> node_set; // 设置查找集合node_set
while(head)
{
if( node_set.find(head) != node_set.end() ) // 如果node_set中已经出现head,则返回head
{
return head;
}
node_set.insert(head);
head = head->next;
}
return NULL;
}
方法二:快慢指针思想
主要思想
ListNode* detectCycle(ListNode* head)
{
ListNode* fast = head;
ListNode* slow = head;
ListNode* meet = NULL;
while(fast)
{
fast = fast->next;
slow = slow->next;
if( !fast )
{
return NULL;
}
fast = fast->next;
if (fast == slow)
{
meet = fast;
break;
}
}
if (meet == NULL)
{
return NULL;
}
while(head && meet)
{
if( head == meet )
{
return head;
}
head = head->next;
meet = meet->next;
}
return NULL;
}
方法一c++代码
方法二c++代码
网友评论