劍指offer第二版 面試題23(java)

2021-09-18 06:38:55 字數 1756 閱讀 2925

面試題23:鍊錶中環的入口節點

題目:

如果乙個鍊錶中包含環,如何找出環的入口節點

問題包含兩個子問題:1. 鍊錶中是否含有環;2. 鍊錶中含有環時,如何找出入口節點

思路:

1. 同題目22中使用兩個指標的方式,此處也使用兩個指標,乙個指標移動得更快,乙個指標移動得更慢,如果更快的指標最後與移動更慢的指標相遇,則說明鍊錶中含有環

2. 令乙個指標一次移動一步,乙個指標一次移動兩步,相遇時移動的次數則為環的長度。

3. 環的入口節點,則可用類似題目22中的,找到倒數第k個節點,但是判斷條件由movenode==null變為movenode==locnode

並且同題目22不同的是,在此處已知有環,並且知道環的長度且長度大於1 && 環的長度大於等於鍊錶的長度,可直接用len作為步伐

(listnode的資料結構和之前的一樣,但是建立鍊錶的方法中多了個引數k,用於指定環的入口,k=0則不建立環

展示鍊錶的方法也有一點變化,多了個引數k用於在對有環的鍊錶進行列印時,不至於無限迴圈)

public class q23 else if(len==1) else if(len>1) 	}	

// 同題目22不同的是,在此處已知有環,並且知道環的長度且長度大於1 && 環的長度大於等於鍊錶的長度

public static listnode startoflink(listnode head,int len)

if(movenode == head)

while(movenode!=locnode)

return locnode; }

/* 判斷鍊錶中是否有環

* 注意:

* i.鍊錶為空

* ii. 鍊錶為指向自己的單節點

*/ public static int lenofloop(listnode head)

// 鍊錶為指向自己的單節點

if(head.next == head)

// 判斷普通鍊錶是否有環

listnode movefast = head.next.next;

listnode moveslow = head.next;

int step = 1;

while(movefast!=null && movefast!=moveslow) else

} // 判斷跳出原因 1.movefast==null 2.movefast.next==null 3.movefast==moveslow

if(movefast==null) else else

}}

return 0; }

// 此處的建立鍊錶和之前的有所不同,k表示鍊錶的入口位置

public static listnode getlink(int k)

if(k!=0)

node.next = kth;

} return head.next; }

public static void showlink(listnode head,int k)

system.out.println();

}}

劍指offer第二版 面試題6(java)

面試題6 從尾到頭列印鍊錶 題目 輸入乙個鍊錶的頭結點,從尾到頭反過來列印出每個結點的值 鍊錶的結點定義如下 public class listnode 注意 面試中,如果打算修改輸入的資料,最好先問好是否資料是允許修改的 思路 1.遍歷順序從頭到尾,列印順序從尾到頭,第乙個結點最開始被訪問,但是最...

劍指offer第二版 面試題8 java

題目描述 給定乙個二叉樹和其中的乙個結點,請找出中序遍歷順序的下乙個結點並且返回。注意,樹中的結點不僅包含左右子結點,同時包含指向父結點的指標 分析 情況 一 有右子樹,這時只需要把其右孩子作為下乙個遍歷的 並不是要找的 節點,然後沿著該節點的左子樹 如果有的話 出發,直到遇到葉子節點,那麼該葉子節...

劍指offer第二版 面試題9(java)

面試題9 用兩個棧實現佇列 題目描述 方法 兩個棧 stack1 stack2 插入時,直接放入stack1 刪除時,直接彈出pop2中的物件 如果pop2為空,則先將pop1中的物件放入stack2中,再從stack2裡pop第乙個 如 依次放入stack1中1 2 3,在彈出並放入stack2中...