✨✨✨专栏:数据结构
🧑🎓个人主页:SWsunlight
一、OJ 环形链表:
快慢指针即可解决问题:
2情况:
- 快指针走到结尾(不是环)
- 快指针和尾指针相遇(是环的)
竟然是2倍关系,那么入环以后,也就是快指针走一次,与慢指针的距离会缩减1.知道N=0,相遇
/** * Definition for singly-linked list. * struct ListNode { * int val; * struct ListNode *next; * }; */ typedef struct ListNode ListNode; //快慢指针 bool hasCycle(struct ListNode *head) { ListNode* phead = head; ListNode* perv = head; //先判断perv是否为空,若是为空,则不会进继续计算,若是先判断perv下个节点,若是perv为NULL,就会导致对空指针进行解引用 while(perv&&perv->next) { perv = perv->next->next; phead = phead->next; if(perv == phead) { return true; } } return false; }
二、OJ 环形链表II:
思路:
比1多了一个条件要返回入环时的节点,实现环形相遇可以直接CV过来,要解决的是怎么找到入环节点:看下面式子,(X-1)*N意思不就是相遇后,(一直转圈)会回到这个点;N-C 不就是相当于L么;此时可以让head开始遍历 从头开始走,慢指针让他从相遇点继续走,当到如环点时必相遇;
typedef struct ListNode ListNode; //快慢指针 struct ListNode *detectCycle(struct ListNode *head) { ListNode* phead = head; ListNode* perv = head; //先判断perv是否为空,若是为空,则不会进继续计算,若是先判断perv下个节点,若是perv为NULL,就会导致对空指针进行解引用 while(perv&&perv->next) { perv = perv->next->next; phead = phead->next; if(phead == perv) { while(perv!=head) { perv = perv->next; head = head->next; } return head; } } return NULL; }