/*
leetcode142
題目描述:給定乙個鍊錶,返回鍊錶開始入環的第乙個節點.
如果鍊錶無環,則返回null.為了表示給定鍊錶中的環,我們使用整形pos來
表示鍊錶尾連線到鍊錶中的位置(索引從0開始).如果pos是-1,則在該鏈
表中沒有環.注意,pos僅僅是用於標識環的情況,並不會作為引數傳遞到函式中.
說明:不允許修改給定的鍊錶。
示例 1:
輸入:head=[3,2,0,4],pos=1
輸出:返回索引為1的鍊錶節點
解釋:鍊錶中有乙個環,其尾部連線到第二個節點;
示例 2:
輸入:head=[1,2],pos=0
輸出:返回索引為0的鍊錶節點
解釋:鍊錶中有乙個環其尾部連線到第一位節點;
示例 3:
輸入:head=[1],pos=-1
輸出:返回null
解釋:鍊錶中沒有環;
解題思路:
利用雙指標,乙個慢指標s、乙個快指標f(2s),設定入環前距離為a,慢指標
入環後走過的距離為b,環剩餘距離為c,其中b+c代表乙個環.
首次相遇:
(1)慢指標走過的路程:s=a+b;
(2)快指標走過的路程:f=a+n(b+c)+b,其中n>=1,快指標起碼在環中走
了一圈以上才可能相遇;
(3)快指標走二步,慢指標走一步,即f=2s;
(4)因此2(a+b)=a+n(b+c)+b,所以a=(n-1)(b+c)+c;
(5)其中n為快指標繞的圈數,當n=1,a=c;當n=2,a=一圈+c;當n=3,
a=兩圈+c....所以c為入環點,就是所求的索引點;
*/
go語言實現
package main
import "fmt"
//建立節點結構/型別
type node struct
next *node
}//建立鍊錶結構
type list struct
//設計介面
type method inte***ce )
isnull() bool
getsize() int
print()
setcycle(n int)
detectcycle() inte***ce{}
}//建立節點
func createnode(v inte***ce{} ) *node
}//建立空鍊錶
func createlist() *list
}//基於method介面實現鍊錶結構體
//在i處插入節點
func (list *list) insert(i int,v inte***ce{})
pre=pre.next }}
//判讀是否為空
func (list *list) isnull() bool
return false
}//返回鍊錶長度
func (list *list) getsize() int
//設計鍊錶列印輸出
func (list *list)print()
}//設定環入口的索引點
func (list* list)setcycle(n int)
for i:=1;i/*尾部節點指向索引節點*/
last.next=temp
}func (list* list)detectcycle()inte***ce{}
} /*如果快指標走到盡頭,沒環*/
for fast==nil||fast.next==nil
/*快指標重新出發,相遇位置就是入口的位置*/
fast=list.head.next
for fast!=slow
return slow.data
}func main()
鍊錶的入環結點
給乙個鍊錶,若其中包含環,請找出該鍊錶的環的入口結點,否則,輸出null。以下為分析過程為 左程雲 程式設計師 面試指南 it名企演算法與資料結構題目最優解 中的解析 如果乙個鍊錶沒有環,那麼遍歷鍊錶一定可以遇到鍊錶的終點 如果鍊錶中有環,那麼遍歷鍊錶就永遠在環裡轉下去了。如何找到第乙個入環結點,具...
鍊錶,迴圈鍊錶,雙向鍊錶,判環和入環點
總結鍊錶相關練習題 鍊錶在計算機中記憶體的分配是不連續的,但是每個節點都有乙個指向下乙個節點的next引用,雙向鍊錶還有乙個指向前乙個節點的prev引用 只要獲得鍊錶的頭,那麼剩下的元素都很容易獲取了。所以鍊錶的每個節點有2個組成部分,乙個是存放資料的資料域,乙個是指向前驅或後繼的引用。public...
Leetcode142,尋找環狀鍊錶入環點
給定乙個鍊錶,返回鍊錶開始入環的第乙個節點。如果鍊錶無環,則返回null。判斷是否有環,可以使用set集合,但是它是無序的,所以不能確定入環位置的下標,所以要使用快慢指標法。如圖示1所示,假設從起始點到入環點距離為a,當慢指標走到入環點的時候,快指標走了2a,因為快指標走兩步,慢指標走一步 假設從2...