核心内容摘要
《高嫁柳家》动漫1-4集全集:一场穿越时空的爱恋,一次家族命运的纠葛
题目要求给你一个链表的头节点head判断链表中是否有环。
如果链表中有某个节点可以通过连续跟踪next指针再次到达则链表中存在环。
为了表示给定链表中的环评测系统内部使用整数pos来表示链表尾连接到链表中的位置索引从 0 开始。
注意pos不作为参数进行传递。
仅仅是为了标识链表的实际情况。
如果链表中存在环则返回true。
否则返回false。
示例 1输入head [3,2,0,-4], pos 1输出true解释链表中有一个环其尾部连接到第二个节点。
示例 2输入head [1,2], pos 0输出true解释链表中有一个环其尾部连接到第一个节点。
示例 3输入head [1], pos -1输出false解释链表中没有环。
提示链表中节点的数目范围是[0, 104]-105 Node.val 105pos为-1或者链表中的一个有效索引。
解答/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */ class Solution { public: bool hasCycle(ListNode *head) { unordered_setListNode*seen; //遍历链表 while(head!NULL) { //如果找到了重复节点,则有环 if(seen.find(head)!seen.end()) { return true; } else { seen.insert(head); headhead-next; } } return false; } };详细解释第 1 行创建 “门牌号登记本”unordered_setListNode*seen;翻译准备一本叫seen的登记本这本本子只记小房子的门牌号而且同一个门牌号只能记一次重复记会被拒绝查起来还特别快。
类比您出门逛小区带了一本空白的登记本专门记走过的房子门牌号防止绕圈。
第 2 行开始 “逛小区” 的循环while(head!NULL)while只要满足条件就一直重复做后面的事循环head!NULL条件是 “当前要逛的房子门牌号不是空的”还有房子可逛翻译从第一个房子head开始只要脚下还有路能找到下一个房子就一直逛。
类比您从小区第一个房子出发只要还能看到下一个房子的门牌号就继续走。
第
行检查当前房子是不是 “逛过了”核心判断if(seen.find(head)!seen.end()) { return true; }if做一个判断满足条件就执行大括号里的事seen.find(head)拿着当前房子的门牌号head翻seen登记本找这个号!seen.end()“不等于登记本的封底”—— 意思是 “找到了这个门牌号”end()是 “没找到” 的标记不是本子末尾return true;找到重复门牌号了说明绕圈了有环直接告诉外面 “有环” 并结束函数。
类比您走到一个房子门口翻登记本一看这个门牌号之前记过→说明您绕回老地方了喊一声 “小区绕圈啦” 就回家。
第
行没逛过就 “登记门牌号继续逛”else { seen.insert(head); headhead-next; }else如果上面的判断不成立没找到重复门牌号就做这些事seen.insert(head)把当前房子的门牌号写进登记本headhead-next;取下一个房子的门牌号当前房子门口贴的next准备逛下一个。
类比您看登记本这个门牌号没记过→把它写进本子然后按门口贴的下一个门牌号走到下一个房子。
第 14 行逛完所有房子没绕圈return false;翻译能走出上面的while循环说明headNULL走到了小区尽头没有下一个房子了而且全程没找到重复门牌号→链表没环告诉外面 “没绕圈”。
类比您把小区所有房子都逛完了走到了路的尽头登记本里也没有重复的门牌号→小区是直的没有绕圈的路