面試題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中...