[leetcode]linked-list-cycle

查看一個鏈表是否是有環node

思路

所謂查看是否是有環,就像是走迷宮的時候查看一條路有沒有走過,能夠採用作標記的方法。標記怎麼作就是一個問題了。我如今有兩種思路。測試

  1. 使用val標記,給每一個走過的node一個獨一無二的int值,若是發現訪問到這個int值,就是有環
    這個其實很難找到一個獨一無二的值,好比設爲 I,你怎麼能保證原鏈表中沒有I這個值。code

  2. 使用next標記,給每一個走過的node一個next值,檢驗是否符合這個條件。好比吧next指向本身,這樣一來,若是檢測到
    有這個特徵的node,就是有環。和使用val標記不一樣的是,若是原來的鏈表中有個這樣的node,那它自己也就是有環,檢測結果也是對的。it


solution 1 (actually it's wrong)

思路1 這其實是一個錯誤的解法,只不過用於測試的鏈表中沒有val爲100的,因此能夠經過。io

/**
 * 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) {
        while(head!=nullptr){
            int tempVal = head->val;
            //head->
            if(tempVal!=100){
                head->val = 100;
            }else{
                return true;
            }
            head = head->next;
        }
        return false;
    }
};

solution 2

思路2class

/**
 * 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) {
        if(head==nullptr){
            return false;
        }

        ListNode* nextTemp;
        //最後一個元素不訪問,執行完while以後,head指向最後一個元素(該元素的next是null)
        //確定不是以前出現過的元素
        while(head->next!=nullptr){ 
            if(head!=head->next){
                nextTemp = head->next;
                head->next = head; //指向自身
                head = nextTemp;
            }else{
                return true;
            }
        }
        return false;
    }
};

總結

若是要檢測是否有循環,又沒有好的檢測標準,就用檢測過的元素弄出一個易於檢測的循環。。。List

本站公眾號
   歡迎關注本站公眾號,獲取更多信息