链表中环的入口节点
链表中环的入口结点
https://www.nowcoder.com/practice/253d2c59ec3e4bc68da16833f79a38e4?tpId=13&tqId=11208&tPage=3&rp=3&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking
这道题是典型的逻辑题,由于链表位置的记录需要借助指针;对于本题而言,关键是查询链表的折返的目的节点;在链表中不能通过值来确定位置,必须通过next指针的指向来唯一确定(对于单向链表,仅一个指针);另外,单链表有个特点:要成环,就不会有指向nullptr的next指针。
程序是这样的:如果链表没有环,则必有next指针指向nullptr,否则,必有环,我们构造死循环(一定有环,所以肯定可以退出);q节点每次向后移动一个节点,go节点从链表头节点开始向后遍历;如果go节点超过了q节点,说明尚未构成环,否则,go节点不会超过q节点;需要注意的是头节点也可能是
环的入口节点。缺点是:时间复杂度有点高~hh;
--ffg
class Solution {
public:
ListNode* EntryNodeOfLoop(ListNode* pHead)
{
if(pHead == nullptr || pHead->next ==nullptr)
return nullptr;
ListNode* p = pHead;
ListNode* go;
ListNode* q = p->next;
while(q->next != NULL)
{
go = p;
if(go == q->next)
return go;
for(; go != q->next ; go = go->next)
if((go != q)&&(go->next == q->next))
return go->next;
q = q->next;
}
return nullptr;
}
};