巧妙利用兩個指標遍歷鍊錶 鍊錶中倒數第k個結點

2021-07-29 07:19:03 字數 1320 閱讀 5356

題目:輸入乙個鍊錶,輸出該鍊錶中倒數第k個結點。為了符合大家的習慣,從1開始計數,即鍊錶的尾節點是倒數第乙個結點。

演算法思路:定義兩個指標,先讓第乙個指標和第二個指標都指向頭結點,然後,讓第乙個指標走k-1步,指向第k個結點;

接著,兩個指標同時移動,當第乙個結點到達末尾的時候,第二個結點所在的位置就是倒數第k個結點。

注意:**的魯棒性。1.判斷頭指標是否為空;判斷k值是否小於等於0;結點的個數有可能少於k

變形:求鍊錶的中間結點;判斷乙個單向鍊錶是否形成了環形結構。 

可執行**:

/*

public class listnode

}*/public class solution

listnode pre = head, last = head;

for(int i = 0;i < k - 1;i++)else

}while(pre.next!=null)

return last;

}}

1.求鍊錶的中間結點。如果鍊錶的結點總數為奇數,返回中間結點;如果結點總數為偶數,返回中間兩個結點的任意乙個。

思路:定義兩個指標,同時從鍊錶的頭結點開始出發,乙個指標一次走一步,另乙個指標一次走兩步。當走得快的指標走到鍊錶末尾的時候,走得慢的指標正好在鍊錶的中間。

public static listnode findmidnode(listnode head)

listnode pre = head,last = head;

while(last.next != null)else

pre = pre.next;

} return pre;

}

2.判斷乙個單向鍊錶中是否存在環路。

思路:定義兩個指標,同時從鍊錶的頭結點開始出發,乙個指標一次走一步,另乙個指標一次走兩步。如果走得快的指標追上了走得慢的指標,那麼鍊錶就是環形鍊錶。如果走的快的指標走到了鍊錶的末尾,都沒有追上第乙個指標,那麼鍊錶就不是環形.

public static booleanisring(listnode head)

listnode pre = head,last = head;

while(last.next != null)else

if(last.next.next == pre)

pre = pre.next;

} return false;

}

鍊錶 合併兩個有序鍊錶

標籤 鍊錶 題目描述 輸入兩個單調遞增的鍊錶,輸出兩個鍊錶合成後的鍊錶,當然我們需要合成後的鍊錶滿足單調不減規則。解題思路 兩種解法 遞迴和非遞迴 拓展 參考 public listnode merge listnode list1,listnode list2 else 非遞迴 public li...

兩個鍊錶生成相加鍊錶

假設鍊錶中每乙個節點的值都在 0 9 之間,那麼鍊錶整體就可以代表乙個整數。給定兩個這種鍊錶,請生成代表兩個整數相加值的結果鍊錶。例如 鍊錶 1 為 9 3 7,鍊錶 2 為 6 3,最後生成新的結果鍊錶為 1 0 0 0。示例1 9,3,7 6,3 struct listnode class so...

兩個鍊錶生成相加鍊錶

假設鍊錶中每乙個節點的值都在 0 9 之間,那麼鍊錶整體就可以代表乙個整數。給定兩個這種鍊錶,請生成代表兩個整數相加值的結果鍊錶。例如 鍊錶 1 為 9 3 7,鍊錶 2 為 6 3,最後生成新的結果鍊錶為 1 0 0 0。示例1 9,3,7 6,3 方法二 使用棧,不需要反轉鍊錶 public l...