和單鏈表類似,只不過是增加了乙個指向前面乙個元素的指標而已。
示意圖:
python 實現**:
#結果為;56!/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():
'linklist is empty.
'return
elif key <0 or key >self.getlength():
'the given key is error
'return
else
:
return
self.getitem(key)
def__setitem__
(self, key, value):
ifself.is_empty():
'linklist is empty.
'return
elif key <0 or key >self.getlength():
'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():
'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
:
'target is not exist!
'def
insert(self,index,item):
if self.is_empty() or index<0 or index >self.getlength():
'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():
'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():
'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)
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 所以後來火車就有了兩個頭,由此可見雙向鍊錶的重要性!雙向鍊錶 在單鏈表結點上增添了乙...