面試筆試記錄 雙向鍊錶(Python)

2021-08-28 12:48:27 字數 3099 閱讀 1657

雙向鍊錶也叫雙鏈表,是鍊錶的一種,它的每個資料結點中都有兩個指標,分別指向直接後繼和直接前驅。所以,從雙向鍊錶中的任意乙個結點開始,都可以很方便地訪問它的前驅結點和後繼結點。一般我們都構造雙向迴圈鍊錶。

'''節點類'''

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 是初始化方法,建立物件後,就立刻...