鍊錶 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...