题解 | #链表中环的入口结点# 标记法(特殊解法)

链表中环的入口结点

https://www.nowcoder.com/practice/253d2c59ec3e4bc68da16833f79a38e4

class Solution {
public:
    ListNode* EntryNodeOfLoop(ListNode* pHead) {
        if(!pHead) return nullptr;	//特殊情况,加这一行可以提高效率,不加程序也可以正常运行
	  
        // 思路:设置一个flag标记节点,如果每个节点时,做标记,将走过的节点的next标记为flag
        auto flag = new ListNode(-1);
        auto cur = pHead;
        while(cur){
            if (!cur->next) {
                return nullptr;
            } else {
                if (cur->next == flag) {
                    break;
                }else {
				  	//进行flag标记
                    auto next_temp = cur->next;//设置一个临时变量,保存下一个节点的位置
                    cur->next = flag; //破坏链表连接,将走过的节点都指向flag
                    cur = next_temp;
                } 
            }
        }
        return cur;
    }
};

思路:遍历列表,每走过一个节点,就将该节点指向一个特殊的flag,从而证明该节点已经被走过。通过该过程,环被破坏,遍历到的最后一个节点就是环起始的位置。

优势:时间复杂度为n,速度快,代码简短易懂

劣势:破坏了链表结构,虽然找到了环,但也导致该链表不可用,同时大量的节点未被回收

全部评论

相关推荐

2 收藏 评论
分享
牛客网
牛客企业服务