链表中环的入口节点

链表中环的入口结点

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;
}
};

全部评论

相关推荐

04-02 16:49
门头沟学院 Java
_bloodstream_:我也面了科大讯飞,主管面的时候听说急招人优先考虑能尽快实习的,我说忙毕设,后面就一直没消息了
点赞 评论 收藏
分享
03-28 19:11
铜陵学院 C++
有礼貌的山羊追赶太阳:太典了,连笔试都没有开始就因为HC满了而结束了,而且还卡你不让你再投其他部门的。
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务