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