python 資料結構之雙向鍊錶的實現

2022-02-21 23:49:51 字數 3660 閱讀 7587

和單鏈表類似,只不過是增加了乙個指向前面乙個元素的指標而已。

示意圖:

python 實現**:

#

!/usr/bin/python

#-*- coding: utf-8 -*-

class

node(object):

def__init__(self,val,p=0):

self.data =val

self.next =p

self.prev =p

class

linklist(object):

def__init__

(self):

self.head =0

def__getitem__

(self, key):

ifself.is_empty():

print

'linklist is empty.

'return

elif key <0 or key >self.getlength():

print

'the given key is error

'return

else

:

return

self.getitem(key)

def__setitem__

(self, key, value):

ifself.is_empty():

print

'linklist is empty.

'return

elif key <0 or key >self.getlength():

print

'the given key is error

'return

else

: self.delete(key)

return

self.insert(key)

definitlist(self,data):

self.head =node(data[0])

p =self.head

for i in data[1:]:

node =node(i)

p.next =node

node.prev =p

p =p.next

defgetlength(self):

p =self.head

length =0

while p!=0:

length+=1p =p.next

return

length

defis_empty(self):

if self.getlength() ==0:

return

true

else

:

return

false

defclear(self):

self.head =0

def q =node(item)

if self.head ==0:

self.head =q

else

: p =self.head

while p.next!=0:

p =p.next

p.next =q

q.prev =p

defgetitem(self,index):

ifself.is_empty():

print

'linklist is empty.

'return

j =0

p =self.head

while p.next!=0 and j

p =p.next

j+=1

if j ==index:

return

p.data

else

:

print

'target is not exist!

'def

insert(self,index,item):

if self.is_empty() or index<0 or index >self.getlength():

print

'linklist is empty.

'return

if index ==0:

q =node(item,self.head)

self.head =q

p =self.head

post =self.head

j =0

while p.next!=0 and j

post =p

p =p.next

j+=1

if index ==j:

q =node(item,p)

post.next =q

q.prev =post

q.next =p

p.prev =q

defdelete(self,index):

if self.is_empty() or index<0 or index >self.getlength():

print

'linklist is empty.

'return

if index ==0:

q =node(item,self.head)

self.head =q

p =self.head

post =self.head

j =0

while p.next!=0 and j

post =p

p =p.next

j+=1

if index ==j:

post.next =p.next

p.next.prev =post

defindex(self,value):

ifself.is_empty():

print

'linklist is empty.

'return

p =self.head

i =0

while p.next!=0 and

not p.data ==value:

p =p.next

i+=1

if p.data ==value:

return

i

else

:

return -1l =linklist()

l.initlist([1,2,3,4,5])

print l.getitem(4)

print l.getitem(5)

l.insert(4,40)

print l.getitem(3)

print l.getitem(4)

print l.getitem(5)

l.delete(5)

print l.getitem(5)

l.index(5)

結果為;56

44056

和單鏈表結果一樣。

ps:雙向鍊錶就是將鍊錶首尾相接。

資料結構之雙向鍊錶

簡述 指標域有乙個指標 而言,占用資源更大,但相應的 雙向鍊錶遍歷的時候只需要乙個指標就可以,而且 只有得到其中任何乙個節點就是得到整個鍊錶,單向鍊錶必須得到他的頭節點,才能遍歷整個鍊錶,而且得有兩個指標。實現 bothwaylinklist.h ifndef mymodule h define m...

資料結構之 雙向鍊錶

單鏈表的結點都只有乙個指向下乙個結點的指標。單鏈表的資料元素無法直接訪問其前驅元素。建立鍊錶 銷毀鍊錶 獲取鍊錶長度 清空鍊錶 獲取第pos個元素操作 插入元素到位置pos 刪除位置pos處的元素 dlinklist dlinklist creat 建立乙個鍊錶 void dlinklist des...

資料結構之雙向鍊錶

雙向鍊錶宛如一列火車,剛發明的時候只有乙個頭,如果它的行駛路線為 a b c d e f g h i j k a 這個時候有一批貨物需要從k運到j,那麼它的運輸路線一定是 k a b c d e f g h i j 所以後來火車就有了兩個頭,由此可見雙向鍊錶的重要性!雙向鍊錶 在單鏈表結點上增添了乙...