✨✨✨专栏:数据结构
🧑🎓个人主页: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; }