Python實現雙向鍊錶

2021-10-08 06:24:35 字數 3558 閱讀 6408

class

dwlinkedlist

:class

node

:"""

結點類 用於存放數值以及前後指標

"""def__init__

(self, value, last,

next

=none):

self.value = value

self.last = last

self.

next

=next

def__init__

(self)

:"""

建立乙個結點 第乙個結點用來存放長度,方便把第乙個當作普通結點處理

"""self.head = self.node(0,

none

) self.tail = self.head

self.head.value =

0def

(self, value)

:"""

插入乙個值到鍊錶末端

由於存在乙個用於儲存長度的結點 第乙個與其他結點可以統一處理

:param value: 需要存放的數值

:return:

"""self.tail.

next

= self.node(value, self.tail)

self.tail = self.tail.

next

self.head.value +=

1def

pop(self)

:"""

刪除最後乙個結點並返回其值

讓未指標指向倒數第二個 並讓倒數第二個的next指向none

:return: 最後乙個結點的值

"""if self.head.value >0:

retvalue = self.tail.value

self.tail = self.tail.last

self.tail.

next

=none

self.head.value -=

1return retvalue

definsert

(self, value, index)

:"""

插入乙個值到索引處

:param value: 插入的值

:param index: 索引

:return:

"""if index >= self.head.value or self.head.value ==0:

else

:# 通過類方法__index_value來索引要插入位置處的結點

next_node = self.__index_value(index)

# 使用乙個二元組拆包將插入結點賦給前後結點的next和last

next_node.last.

next

, next_node.last =

(self.node(value, next_node.last, next_node),)

*2self.head.value +=

1def

remove

(self, index)

:"""

移除索引處的值

:param index: 索引

:return:

"""rm_node = self.__index_value(index)

# 如果移除的值是最後乙個 則呼叫pop方法

if rm_node is self.tail:

self.pop(

)else

: rm_node.last.

next

= rm_node.

next

rm_node.

next

.last = rm_node.last

self.head.value -=

1def

__len__

(self)

:return self.head.value

def__iter__

(self)

:# 第乙個結點的值是長度

cur = self.head.

next

while cur:

yield cur.value

cur = cur.

next

def__index_value

(self, key)

:"""

返回對應索引處的結點

:param key: 索引

:return: 結點 class self.node例項

"""# 如果是負索引,將其轉換為正索引 反向越界則為0

if key <0:

key = self.head.value + key if self.head.value >

-key else

0# 索引越界

if key >= self.head.value:

raise indexerror

# 判斷索引位置選擇正反向查詢

if key < self.head.value /2:

cur = self.head.

next

for _ in

range

(key)

: cur = cur.

next

else

: cur = self.tail

item = self.head.value - key -

1for _ in

range

(item)

: cur = cur.last

return cur

def__setitem__

(self, key, value)

: self.__index_value(key)

.value = value

def__getitem__

(self, item)

:return self.__index_value(item)

.value

def__str__

(self)

:# [dwlinkedlist : 0 <-> 1 <-> 2 <-> 3 <-> 4 <-> 5 <-> 6 <-> 7 <-> 8 <-> 9]

return

'[dwlinkedlist : {}]'

.format

(' <-> '

.join(

map(

str, self)))

defiter_reverse

(self)

:"""

反向迭代

:return: 生成器

"""cur = self.tail

for _ in

range

(self.head.value)

:yield cur.value

cur = cur.last

實現雙向鍊錶(Python)

可以快速找到上 下節點,也可以快速去掉鍊錶中的某乙個節點。encoding utf 8 class node def init self,key,value self.key key self.value value self.prev none self.next none def str sel...

python實現雙向鍊錶

雙向鍊錶節點 def init self,item self.item item self.next none self.prev none class dlinklist object def init self self.head none defis empty self return sel...

雙向鍊錶實現

template class link link link pre null,link ne null void operator new size t void operator delete void ptr template link link freelist null template v...