LeetCode 返回鍊錶入環的第乙個節點

2021-10-10 21:32:05 字數 1990 閱讀 8314

/*

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...