鍊錶,迴圈鍊錶,雙向鍊錶,判環和入環點

2021-09-30 01:19:16 字數 2785 閱讀 4467

總結鍊錶相關練習題

鍊錶在計算機中記憶體的分配是不連續的,但是每個節點都有乙個指向下乙個節點的next引用,(雙向鍊錶還有乙個指向前乙個節點的prev引用),只要獲得鍊錶的頭,那麼剩下的元素都很容易獲取了。所以鍊錶的每個節點有2個組成部分,乙個是存放資料的資料域,乙個是指向前驅或後繼的引用。

public

class

singlelinkedlistincludehead

}@suppresswarnings

("unchecked"

)public

singlelinkedlistincludehead()

//頭插法 head之後去新增元素

public

void

addhead

(e data)

//尾插法

public

void

addtail

(e data)

//繫結最後的乙個節點的next

tmp.next = newnode;

}public

boolean

delete

(e data)

//刪除某乙個正常節點

node

tmp = head;

while

(tmp.next != null)

tmp = tmp.next;

}return

false;}

//返回指定位置的節點

public node

findvalue

(int index)

if(index <=0)

return null;

}//得到當前鍊錶的長度

public

intgetlength()

return size;

}//遍歷鍊錶

public string tostring()

return sb.

tostring();}}

不帶頭節點的單鏈表基本同上,不同的地方即帶頭單鏈表在new的時候就有乙個空節點,但是不帶頭的單鏈表在第一次add節點的時候才有第乙個節點。

迴圈鍊錶的特點是最後乙個節點的next引用指向頭節點,構成迴圈。

所以在尾**入節點的時候,要把插入的節點的next指向頭節點,並把插入的節點的上乙個節點的next指向插入的節點。

刪除節點的時候,要把刪除的節點的上乙個節點的next指向刪除節點的下乙個節點,如果刪除的節點是最後乙個,那麼需要把刪除節點的上乙個節點的next指向頭節點即可。

雙向鍊錶的特點是內部node類的引用域多了乙個prev,即指向前乙個節點的引用。

所以在尾**入節點的時候,要把插入的節點的next指向null,prev指向原來鍊錶的最後乙個節點。

刪除節點的時候,要把刪除節點的上乙個節點的next指向刪除節點的下乙個節點,把刪除節點的下乙個節點的prev指向刪除節點的上乙個節點,如果刪除的節點是最後乙個,那麼需要把刪除節點的上乙個節點的next指向null即可。

雙向迴圈列表的特點是最後乙個節點的next引用指向頭節點,同時頭節點的prev引用指向最後乙個節點,構成迴圈。

所以在尾**入節點的時候,要把插入的節點的next指向頭節點,並把插入的節點的上乙個節點的next指向插入的節點的同時,還要把插入的節點的prev指向它的上乙個節點,並把頭節點的prev指向插入的節點。

刪除節點的時候,要把刪除節點的上乙個節點的next指向刪除節點的下乙個節點,並把刪除節點的下乙個節點的prev指向刪除節點的上乙個節點。

鍊錶的節點依靠next和prev引用乙個連著乙個,這樣如果在鍊錶中設定兩個指向頭節點和尾節點的引用,就可以讓插入或刪除節點的時間複雜度降低到常數,但是讀取的時間複雜度依然是線性的,因為鍊錶沒法像陣列一樣快速定位到某乙個節點(或資料)。

因為要逆序列印,所以要先遍歷單鏈表至最後乙個節點,然後一級一級往前,可以考慮遞迴。

public

void

reverseprintlist

(node head)

reverseprintlist

(head.next)

; system.out.

println

(head.element +

" ")

;}

快慢指標法,定義兩個引用都從頭節點開始向後移動,快指標一次移動兩個節點,慢指標一次移動乙個節點,如果他們在某乙個時刻移動到了同乙個節點上(相遇),就說明鍊錶是有環的,否則沒有環。(如果鍊錶沒有環,他們永遠不會相遇。)

public

boolean

islooplinkedlist

(mylinkedlist x)

}return

false

;}

在2題的基礎上,快慢兩個指標一定在環的某個節點相遇,相遇時的圖如下:

假設c點為相遇點,b點為入環點,a點為鍊錶的頭節點,那麼快指標走的路程為m+n+x+n=m+2n+x,慢指標走的路程為m+n

又因為快指標的速度是慢指標的二倍,所以快指標的路程也應該為慢指標的二倍,所以m+2n+x = 2(m+n),解得x = m,即從第一次相遇點到入環點的距離,等於從頭節點到入環點的距離。

那麼,他們第一次在c點相遇後,我讓快慢指標的步長都為1,並且把快指標拉回煉表頭節點,讓它們乙個從c點開始走,步長為1,乙個從a點開始走,步長為1,那麼他們再次相遇的節點就是入環點。

鍊錶17 鍊錶判環

題目 如何判斷乙個單鏈表是否有環?有環的話返回進入環的第乙個節點的值,無環的話返回 1。如果鍊錶的長度為n,請做到時間複雜度o n 額外空間複雜度o 1 給定乙個單鏈表的頭結點head 注意另乙個引數adjust為加密後的資料調整引數,方便資料設定,與本題求解無關 請返回所求值。詳見lb7,只是返回...

鍊錶判環練習

如何判斷乙個單鏈表是否有環?有環的話返回進入環的第乙個節點的值,無環的話返回 1。如果鍊錶的長度為n,請做到時間複雜度o n 額外空間複雜度o 1 給定乙個單鏈表的頭結點head 注意另乙個引數adjust為加密後的資料調整引數,方便資料設定,與本題求解無關 請返回所求值。弗洛伊德判環法,演算法證明...

雙向鍊錶和雙向迴圈鍊錶

和單向鍊錶相比,多了乙個前驅結點。如果他為空,那麼next和prior都指向自己。而對於雙迴圈鍊錶,只需要最後乙個元素的next指向head next,head next的prior指向最後乙個節點即可。新節點s插入鍊錶,s next給p結點,s prior給p prior,然後,p prior n...