劍指Offer對答如流系列 鍊錶中環的入口節點

2021-10-02 09:23:04 字數 1035 閱讀 4021

乙個鍊錶中包含環,如何找出環的入口結點?例如,在圖中的鍊錶中,環的入口結點是結點3。

鍊錶的結構

public

class

listnode

}

首先不能忽略鍊錶中不包含環的情況,第一件事情必須先確定鍊錶是否有環:我們可以使用兩個引用,乙個跑的快、乙個跑的慢,同時出發,跑的快的追上跑的慢的自然說明有環。(術語是常說的快慢引用)

如果鍊錶有環,第二件事是確定鍊錶中的環節點的個數,在第一件事情中,快引用追上了慢引用,以追上的位置為起點(肯定在環中),走一圈,邊走邊計數。

現在問題轉換為求 鍊錶中倒數第k個結點。k的值為鍊錶中環的長度。

public listnode entrynodeofloop

(listnode head)

//計算環中結點的數目

int count=1;

listnode pnode1 = meetingnode.next;

while

(pnode1!=meetingnode)

// 求煉表中倒數第k個結點

pnode1=head;

for(

int i=

1;i<=count;i++

) listnode pnode2=head;

while

(pnode1!=pnode2)

return pnode1;

}private listnode meetingnode

(listnode head)

listnode pslow=head;

listnode pfast=head;

while

(pfast!=null)

if(pslow!=null && pslow==pfast)

}return null;

}

劍指Offer對答如流系列 醜數

我們把只包含質因子2 3和5的數稱作醜數 ugly number 求按從小到大的順序的第n個醜數。例如6 8都是醜數,但14不是,因為它包含質因子7。習慣上我們把1當做是第乙個醜數。判斷乙個數是不是醜數,最容易想到的方法就是讓這個數不斷除以2,3,5。對於第n個醜數,只要從1開始,依次判斷每個數是不...

劍指Offer對答如流系列 剪繩子

給你一根長度為n繩子,請把繩子剪成m段 m n都是整數,n 1並且m 1 每段的繩子的長度記為k 0 k 1 k m k 0 k 1 k m 可能的最大乘積是多少?例如當繩子的長度是8時,我們把它剪成長度分別為2 3 3的三段,此時得到最大的乘積18。遇到問題,先分析問題,由分析的結果確定所運用的演...

劍指Offer對答如流系列 包含min函式的棧

定義棧的資料結構,請在該型別中實現乙個能夠得到棧的最小元素的min函式。在該棧中,呼叫min push及pop的時間複雜度都是o 1 push 和 pop均容易實現。主要就是min函式的定義,如果要通過操作push和pop操作獲取最小元素時間複雜度為o 1 基本上是不可能的。如果我們另外定義乙個成員...