算法基础~链表~链表求环解法一,借助set集合
1,成环的链表的图解:
2,从图解,我们得知,下个结点指向的结点先前已经遍历过(存在过了)则成环,找到环的起点~ 解释一下why使用到工具set集合?
because 要找到遍历过的结点它身上没有任何标志,是需要从第一个结点开始循环遍历到它身上的【所以选择放到工具set集合,利用工具set封装好的方法find 遍历】
3,✿小小 心得:某个结点(身上没有任何标志),比较时又得从第一个结点开始循环,可以借助前人写好的好工具 set集合【封装了增删改查 方法】
所以到这里就知道要使用set集合啦!
● 4,思路:【set 集合的元素就是把遍历过的结点指针(地址)“装”进去,然后每次移动到下个结点,
看它的next指针的指向是否指向已经遍历过的结点(即已经“装”到set中,可以通过遍历set集合中的元素,
调用set的find 方法进行比较得知)】
5,上代码,解析思路看2、3、4
class Solution{ public: ListNode *detectCycle(ListNode *head){ std::set<ListNode*> node_set; while(head){ if(node_set.find(head) != node_set.end()){ return head; } node_set.insert(head); head = head->next; } return NULL; } }