链表中的快慢指针问题

寻找链表的中点

下面这个两个if分别是odd和even所特有的

if(fast->next == NULL) break;// odd
if(fast->next->next == NULL) break;// even
class Solution {
public:
    ListNode* middleNode(ListNode* head) {
        ListNode *fast = head, *slow = head;
        //  为了防止fast = fast->next->next发生空指针错误 => 这才有了while的条件
        while(fast && fast->next) {
            slow = slow->next;
         // if(fast->next->next == NULL) break;  // even所特有的 => 这句话可以实现拿到前面那个
            fast = fast->next->next;
        }
        // 如果是偶数返回的是中间那两个的后面一个
        return slow;
    }
};

判断链表是否成环

bool hasCycle(List head) {
    List fast = head, slow = head;
    while(fast && fast->next) {
        fast = fast->next->next;
        slow = slow->next;
        // 如果有环的话,肯定不会因为while的条件终止循环
        // 一快一慢在环中 => 终会相遇
        if(slow == fast) return true;
    }
    return false;
}

那如果我还想找到成环点呢?

List detectCycle(List head) {
    List fast = head, slow = head;
    while(fast && fast->next) {
        fast = fast->next->next;
        slow = slow->next;
        if(slow == fast) break;
    }
//    出循环有两种原因:相遇 || 无环
    if(!fast || !fast->next) return NULL;
//    让任意一种指针回到头节点处,两指针同速前进,再相遇处就成环点
    fast = head;
    while(slow != fast) {
        slow = slow->next;
        fast = fast->next;
    }
    return slow;
}

你可能感兴趣的:(链表,数据结构,leetcode)