1. 程式人生 > >Java演算法:判斷單鏈表是否有環

Java演算法:判斷單鏈表是否有環

README

單鏈表是否有環,這是一個挺有意思的問題,這裡我並沒有提出新的解法,而是解釋了現有的解法,幫助新人和自己理解。

題目描述

判斷一個單鏈表是否有環,如果有,返回第一個環內的節點的引用,如果沒有環,返回nuill。

程式設計依據

1. 兩個指標從連結串列頭部同時出發,一個每次前進一步,另一個每次前進兩步,如果有環,為什麼它們一定會相遇?

假設pOne前進k步後,第一次到達環內,那麼,pTwo已經相對於位置k又在環內前進了k步。以後它們就在環內相互追趕,因為pTwo速度是pOne的兩倍,所以pTwo一定會越過pOne。越過的過程有2種情況,如圖所示。因為pTwo的跨度為1個節點,而pOne會在相鄰的兩個節點移動,所以pTwo不可能在不相遇的情況下跨過pOne。
這裡寫圖片描述

2. pOne從兩個指標相遇處繼續前進k步,為什麼一定會到達環的入口位置k?

假設環的長度為len,k = n * len + s1,那麼pOne第一次進入環時兩個指標的位置如左圖所示。
這裡寫圖片描述

由於pTwo速度是pOne的兩倍,那麼它們相遇時,pTwo要前進2 * s2,而pOne前進s2(其中s2 = len - s1),如右圖所示,從第一次相遇起,pOne繼續前進k步,那麼pOne在進入環後總共前進的距離為s2 + k = s2 + s1 + n * len = (n + 1) * len,所以pOne又回到了入口。

程式設計實現

思路:
1. 設定兩個指標,一個指標每次前進一步,一個指標每次前進兩步,如果它們中有一個先到達連結串列末尾,那麼無環,否則它們一定會相遇。
2. 相遇後,每次前進一步的指標繼續前進,同時另設一個指標從連結串列頭部開始每次前進一步,它們必然會相遇於環的入口。

public class Test{

    public static class LinkedList{
        int data;
        LinkedList next;

        public LinkedList(int data){
          this.data = data;
          this.next = null;
        }
    }


    public static LinkedList isCyclicLinkedList(LinkedList head){
        if(head == null
){ return null; } LinkedList pOne = head; // one step per move LinkedList pTwo = head; // two step per move if(pTwo.next != null){ pTwo = pTwo.next.next; } else { return null; } pOne = pOne.next; // find the first meet, or null while(pTwo != pOne){ if(pTwo != null && pTwo.next != null){ pTwo = pTwo.next.next; } else{ return null; } pOne = pOne.next; } // cyclic, find the first node in the cycle while(head != pOne){ pOne = pOne.next; head = head.next; } return pOne; } }

參考資料

相關推薦

Java演算法判斷單鏈是否

README 單鏈表是否有環,這是一個挺有意思的問題,這裡我並沒有提出新的解法,而是解釋了現有的解法,幫助新人和自己理解。 題目描述 判斷一個單鏈表是否有環,如果有,返回第一個環內的節點的引用,如果沒有環,返回nuill。 程式設

Java判斷單鏈是否的兩種實現方法

http://blog.jobbole.com/106227/ 方法一:首先從頭節點開始,依次遍歷單鏈表的每一個節點。每遍歷到一個新節點,就從頭節點重新遍歷新節點之前的所有節點,用新節點ID和此節點之前所有節點ID依次作比較。如果發現新節點之前的所有節點當中存

題目程式碼實現判斷單鏈是否

#include "stdio.h" #define OK 1 #define ERROR 0 #define TRUE 1 #define FALSE 0 #define MAXSIZE 20 /* 儲存空間初始分配量 */ typedef int Status;/* Status是函式的型別,其值

11.判斷單鏈是否

兩個指針 next 測試 重載 else reader sta clas 復雜度 判斷單鏈表是否有環: 這裏也是用到兩個指針,如果一個鏈表有環,那麽用一個指針去遍歷,是永遠走不到頭的。 因此,我們用兩個指針去遍歷:first指針每次走一步,second指針每次走兩步

判斷單鏈是否

plc .html weibo app sin pla mpc html cnblogs 辜鈉魯u0ri0忌蠱負http://huiyi.docin.com/txqq_8fb449e9c9儼夾銥43gi1鑰倚蚜http://www.docin.com/app/user/us

判斷單鏈是否,如果找出的入口位置=>求兩個相交連結串列的交點

首先如何判斷一個連結串列是否有環: 設定兩個指標(fast, slow),初始值都指向頭,slow每次前進一步,fast每次前進二步,如果連結串列存在環,則fast必定先進入環,而slow後進入環,兩個指標必定相遇。(當然,fast先行頭到尾部為NULL,則為無環連結串列

迴圈連結串列的特性以及判斷單鏈是否(九)

typedef struct CLinkList { int data; struct CLinkList* next; }node; typedef struct CLinkList* LinkList; int compareStep(LinkList L) { LinkList cur1 = L;

判斷單鏈是否,並找出的入口【python】

問題: 1、如何判斷一個連結串列是不是這類連結串列? 2、如果連結串列為存在環,如果找到環的入口點? 一、判斷連結串列是否存在環,辦法為: 設定兩個指標(fast, slow),初始值都指向頭,slow每次前進一步,fast每次前進二步,如果連結串列存在環,則fast必定先進入環,而slow後進入環

如何判斷單鏈是否的入口、的長度和總長

問題描述 1.如何判斷單鏈表是否有環? 2.如果有環,求出環的入口 3.求環長 4.求總長 探討 要想判斷有環,我們可以聯絡實際生活中的例子,很容易就想到操場上跑圈,因為是環形,所以快的肯定會追上慢的,所以我們可以應用到連結串列上,用一個快

龜兔算法判斷是否、確定的入口

判斷鏈表是否有環 正整數 表頭 ali inf lib 節點 bubuko 算法 1.使用快慢指針,fast=fast.next.next,slow=slow.next,若鏈表存在環,那麽fast和slow一定會相遇,相遇的節點在環內,接下來需要確定環的入口。 2.如圖,

演算法之(二)判斷一個單鏈是否

思路:如果一個單鏈表中有環,用一個指標去遍歷,永遠不會結束,所以可以用兩個指標,一個指標一次走一步,另一個指標一次走兩步,如果存在環,則這兩個指標會在環內相遇,時間複雜度為O(n)。 拓展問題1:如果單鏈表有環,找出環的入口節點(環的連線點)。 這裡先證明一個

【LeetCode-面試演算法經典-Java實現】【142-Linked List Cycle II(單鏈II)】

原題   Given a linked list, return the node where the cycle begins. If there is no cycle, retu

筆試題判斷一個單鏈是否,如果,找出的起始位置

</pre><pre name="code" class="cpp">Node * FindLoop(Node *phead) { Node *p = phead,q = phead,h = phead; while(p && q->next)

如何判斷一個單鏈是否

算法 查找 public class LinkedListRing{ static class LinkedNode<T>{ private T t ; private LinkedNode<T> next = null; public LinkedNode(T t)

java實現---判斷單鏈是否帶?若帶,求的長度?求的入口點?

判斷 單鏈表是否帶環 若帶環,求環的長度 求環的入口點 單鏈表是否帶環 判斷一個連結串列是否帶環 我們可以定義兩個快慢節點,快的一次走兩步,

筆試題如何判斷單鏈是否存在

1.如何判斷是否有環?如果有兩個頭結點指標,一個走的快,一個走的慢,那麼若干步以後,快的指標總會超過慢的指標一圈。 2.如何計算環的長度?第一次相遇(超一圈)時開始計數,第二次相遇時停止計數。 3.如何判斷環的入口點:碰撞點p到連線點的距離=頭指標到連線點的距離,

如何判斷一個單鏈是否以及入口

這是一個在我們學習資料結構的時候經常會遇到的問題,今天給大家帶來這個問題的幾種解法。 方法一 最容易想到的辦法就是遍歷單鏈表,如果單鏈表有環的話那麼會進入死迴圈,但是我們不知道單鏈表的長度,所以如果單鏈表長度很長,我們一直向下遍歷,也無法分辨出是單鏈表還

單鏈是否Java版)

題目:判斷一個帶頭結點的單鏈表L是否有環 解題思路: 咋看之下,這題還真不好解,於是又一些投機取巧的人,在訪問單鏈表中元素的時候,用一個比較大的數N控制訪問元素的個數,他們認為如果在訪問到第N個元素之

判斷一個單鏈是否

主函式中沒有出現具體的連結串列,主要看判斷有無環函式ExitLoop. 外函式的while迴圈條件的判定:如果fast指標指向NULL,if條件語句不成立,返回flag=0:不存在環。 如果flag走到最後一個結點時,要是不給定一個條件,while繼續執行,flag一次迴圈

Java語言 檢測單鏈是否

true ava nis sca 語言 har 判斷 emp ret /** * 判斷鏈表是否有環 * @author Administrator * */public class P238 { public static void main(String[] arg