鍊錶LinkedList

2021-10-19 06:17:09 字數 3305 閱讀 1017

鍊錶 linkedlist 與 陣列 arraylist 一樣是「表」的一種。與陣列會占用一塊連續記憶體不同的是,鍊錶的記憶體占用不一定是連續的。鍊錶由一系列節點 nodes 組成,每乙個節點均含有表元素和到包含該元素後繼元的節點的鏈,即「next 鏈」,這是單向鍊錶。如果還有對前驅元的節點的引用,則為雙向鍊錶。

下面是我自己實現的雙向鍊錶。這裡仿照 swift 對 array 的實現,給出一些常用的方法,並考慮泛型和合理的封裝。

完整**

節點的結構比較簡單。element為節點攜帶的元素/值,next指向後繼節點,prev指向前驅節點。由於listnode類的主要功能是承載鍊錶的元素element和維護對前驅、後繼節點的引用,並不需要向外界暴露,因此加private

private

class

listnode

<

element

>

}

這裡實現的是雙鏈表,因此要維護頭節點head和尾節點tail,並儲存當前鍊錶的節點總數count。同時我們把上面listnode類宣告在此類裡。

class

linkedlist

<

element

>

varlast

:element

?var

isempty

:bool

private

(set

)var

count

:int=0

private

class

listnode

<

element

>

private

var head:

listnode

<

element

>

?private

var tail:

listnode

<

element

>

?}

常用方法
subscript

(index:

int)

->

element

?set

else}}

private

subscript

(nodeat index:

int)

->

listnode

<

element

>

?else

if index ==

count-1

else

return curr?

.next

}else

return curr?

.prev

}}}setelse

if index ==

count-1

else

iflet curr =

self

[nodeat: index]

}else

}}

func

(_ newelement:

element

)private

func

(node:

listnode

<

element

>

)else

count+=

1}

func

insert

(_ newelement:

element

, at index:

int)

private

func

insert

(node:

listnode

<

element

>

, at index:

int)

count+=

1}else

if index ==

count

}

func

remove

(at index:

int)

->

element

?private

func

remove

(nodeat index:

int)

->

listnode

<

element

>

?else

if index ==

count-1

curr.prev?

.next = curr.next

curr.next?

.prev = curr.prev

curr.prev =

nil curr.next =

nil result = curr

count-=

1}return result

}

extension

linkedlist

where

element

:equatable

curr = curr?

.next

}return

false

}}

current.next: 當前節點的後繼指向(setter) / 當前節點的後繼節點(getter)

current.next.next:後繼節點的指向(setter) / 後繼節點的下一節點(getter)

有關鍊錶的解題技巧,個人小結如下:

雙/三指標:使用迭代步速相同的兩個或多個指標進行比對,如反轉鍊錶、判斷鍊錶是否相交、回文鍊錶、分隔鍊錶等;

快慢指標:慢指標一次走一步,快指標一次走兩步。這種方法可以用於找到鍊錶的中點、找出某個相交的節點等,如回文鍊錶、環路檢測等;

使用啞節點(dummy head & dummy tail):可簡化對鍊錶結構上有改動的操作(插入、刪除);

使用遞迴:當前節點的操作結果依賴於後繼節點的操作結果,即往往遞迴函式的入參是head.next,如排序鍊錶、反轉鍊錶等。

LinkedList 鍊錶

線性表是一種簡單的資料結構,其主要特點是元素之間存在 一對一 的關係,除去第乙個元素,每個元素都存在唯一乙個 前驅節點 除去最後乙個元素都存在唯一乙個 後繼節點 簡單的線性表有 陣列 單鏈表 雙向鍊錶 靜態鍊錶等。順序表 陣列 優缺點 陣列不僅邏輯上,物理上位置也相鄰,可隨機訪問,但刪除或插入元素時...

LinkedList 鍊錶

最近複習到鍊錶 linkedlist 一般來說共有大概有兩種實現方式 1.陣列實現 和 2.鏈式實現。我僅使用了直接鏈式實現,如下。其他的實現方式,大家不妨自己嘗試下吧。author ace yom peizhen zhang date 2015 8 17 description 鍊錶實現 ifnd...

鍊錶 LinkedList

原文中singlelinklist的remove方法有問題,因為是 node current firstnode.getnext 所以導致鍊錶的第乙個節點刪不掉。修改如下 public class singlelinklist 刪除某個節點 param element return 刪除成功返回tr...