眾所周知,鍊錶是不知道長度的,如果想知道長度只能通過遍歷一遍鍊錶才可得知,因此對於查詢未知鍊錶長度的中間結點可以有很多方法。
最簡單的方法就是通過遍歷一邊鍊錶得到長度l,再通過遍歷l/2的鍊錶得到中間結點,此時時間複雜度就是o(l+l/2).
而另一種更簡便方法則為通過建立兩個指標,第乙個指標為第二個指標速度的兩倍,那麼當第乙個指標到達鍊錶末尾的時候,就可以得知此時第二個指標在中間結點。
**如下:
注:initlink為初始化鍊錶,即新增根節點,新增結點的方法為尾插法,在其他文章中有寫到,在這裡直接使用。
public
class
formidnode
i++; system.out.
println
("此時的first指向的陣列是"
+first.
getdata()
);system.out.
println
("此時的follow指向的陣列是"
+follow.
getdata()
);} system.out.
println
("最後的first指向的陣列是"
+first.
getdata()
);system.out.
println
("中間結點的數值是:"
+follow.
getdata()
);}public
static
void
main
(string [
] args)
}
執行結果:
而下邊的方法是剛剛方法的改進,在上邊方法中可以看到,雖然說我們是在同時時間進行兩個指標的遍歷,但是我們採用的方法是,第乙個指標一直移動,第二個指標等一段時間停止移動,這樣的等待就會造成時間浪費,而且第乙個指標也會對每乙個結點進行遍歷,因此我們對此進行改進,讓第乙個的指標的速度真正成為第二個指標速度的兩倍,即讓第乙個指標永遠指向next的next(如果next的next不為空的情況下),**如下:
public
void
formidnode1
(linkedlist linkedlist)
else first=first.next;
system.out.
println
("此時的first指向的陣列是"
+first.
getdata()
);system.out.
println
("此時的follow指向的陣列是"
+follow.
getdata()
);} system.out.
println
("最後的first指向的陣列是"
+first.
getdata()
);system.out.
println
("中間結點的數值是:"
+follow.
getdata());}
執行結果:
從執行結果來看,也可以發現少執行了很多環節。
鍊錶的中間結點
題目 給定乙個帶有頭結點 head 的非空單鏈表,返回鍊錶的中間結點。如果有兩個中間結點,則返回第二個中間結點。示例 1 輸入 1,2,3,4,5 輸出 此列表中的結點 3 序列化形式 3,4,5 返回的結點值為 3 測評系統對該結點序列化表述是 3,4,5 注意,我們返回了乙個 listnode ...
鍊錶的中間結點
給定乙個帶有頭結點 head 的非空單鏈表,返回鍊錶的中間結點。如果有兩個中間結點,則返回第二個中間結點。示例 1 輸入 1,2,3,4,5 輸出 此列表中的結點 3 序列化形式 3,4,5 返回的結點值為 3 測評系統對該結點序列化表述是 3,4,5 注意,我們返回了乙個 listnode 型別的...
鍊錶的中間結點
力扣題目鏈結 給定乙個帶有頭結點 head 的非空單鏈表,返回鍊錶的中間結點。如果有兩個中間結點,則返回第二個中間結點。例項1 輸入 1,2,3,4,5 輸出 此列表中的結點 3 序列化形式 3,4,5 返回的結點值為 3 例項2 輸入 1,2,3,4,5,6 輸出 此列表中的結點 4 序列化形式 ...