雙向鍊錶也叫雙鏈表,是鍊錶的一種,它的每個資料結點中都有兩個指標,分別指向直接後繼和直接前驅。所以,從雙向鍊錶中的任意乙個結點開始,都可以很方便地訪問它的前驅結點和後繼結點。一般我們都構造雙向迴圈鍊錶。
'''節點類'''
class node(object):
def __init__(self,data = none):
self.data = data
self.pre = none
self.next = none
'''初始化雙向鍊錶'''
class dlinklist(object):
def __init__(self):
"""設定頭尾,操作比較容易
頭--(next)--》尾
尾--(pre)--》頭
:return:
"""head = node()
tail = node()
self.head = head
self.tail = tail
self.head.next = self.tail
self.tail.pre = self.head
def __len__(self):
length = 0
node = self.head
while node.next != self.tail:
length += 1
node = node.next
return length
def print_(self):
node = self.head
while node.next != self.tail:
print(node.next.data)
node = node.next
""":param data:
:return:
"""node = node(data)
x = self.tail.pre
x.next = node
node.pre = x
node.next = self.tail
self.tail.pre = node
return node
def get(self,index):
"""獲取第index個值,若index>0正向獲取else 反向獲取
:param index:
:return:
"""node = self.head.next
num = none
for i in range(index+1):
num = node.data
node = node.next
return num
def set(self,index,data):
node =self.head
for i in range(index+1):
node = node.next
node.data = data
return node
def insert(self,index,data):
"""因為加了頭尾節點所以獲取節點node就一定存在node.next 和 node.pre
:param index:
:param data:
:return:
"""length = len(self)
if (index+1)>length:
return false
index = index if index >=0 else index + 1+length
next_node = self.get(index)
if next_node:
node = node(data)
pre_node = next_node.pre
pre_node.next = node
node.pre = pre_node
node.next = next_node
next_node.pre = node
return node
def delete(self,index):
node = self.head
for i in range(index):
node = node.next
node2 = node.next.next
node.next = node2
node2.pre = node
'''反轉鍊錶'''
def __reversed__(self):
"""1.node.next --> node.pre
node.pre --> node.next
2.head.next --> none
tail.pre --> none
3.head-->tail
tail-->head
:return:
"""pre_head = self.head
tail = self.tail
def reverse(pre_node, node):
if node:
next_node = node.next
node.next = pre_node
pre_node.pre = node
if pre_node is self.head:
pre_node.next = none
if node is self.tail:
node.pre = none
return reverse(node, next_node)
else:
self.head = tail
self.tail = pre_head
return reverse(self.head, self.head.next)
def clear(self):
self.head.next = self.tail
self.tail.pre = self.head
n = dlinklist()
n.__reversed__()
n.delete(0)
n.print_()
面試筆試題記錄
資料庫有x鎖及s鎖,請問如何用c 實現這種類似的讀寫鎖。遠景能源的一面題目。解決方法如下 用兩個鎖,乙個mutex mlock乙個semophore semlock,假設semlock初始為64,即最多不會超過64條執行緒同時做讀寫操作。s鎖 即讀鎖 的實現如下 req semlock 1 請求乙個...
面試筆記 資料結構 雙向鍊錶
雙向鍊錶是單鏈表的一種改進。單鏈表只能順著指標方向找到結點的後續結點,而無法找到其前驅結點。為此發明了迴圈鍊錶,只要通過迴圈的指標後移,一定可以找到前驅節點。但是迴圈鍊錶操作起來時間複雜度比較高,需要迴圈遍歷整個鍊錶。對於那些需要經常沿兩個方向移動指標的鍊錶來說,雙向鍊錶更合適。與單鏈表不同,雙向鍊...
Python面試筆試題記錄
1 python2和python3的range 100 的區別?python2返回列表,python3返回迭代器,節約記憶體 2 一句話解釋什麼樣的語言能夠用裝飾器?函式可以作為引數傳遞的語言,可以使用裝飾器 3 簡述物件導向中 new 和 init 區別?init 是初始化方法,建立物件後,就立刻...