查詢未知鍊錶長度的中間結點

2021-10-25 12:24:12 字數 1758 閱讀 6477

眾所周知,鍊錶是不知道長度的,如果想知道長度只能通過遍歷一遍鍊錶才可得知,因此對於查詢未知鍊錶長度的中間結點可以有很多方法。

最簡單的方法就是通過遍歷一邊鍊錶得到長度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 序列化形式 ...