鍊錶問題知識點和注意事項
1.鍊錶問題演算法難度不高,但考察**實現能力。
2.鍊錶和陣列都是一種線性結構,陣列是一段連續的儲存空間,鍊錶空間不一定保證連續,是臨時分配的
鍊錶問題**實現關鍵點
1.鍊錶調整函式的返回值,型別要求往往是節點型別。
2.處理鍊錶過程中,先採用畫圖的方式理清邏輯。
3.鍊錶問題對於邊界條件討論要求嚴格。
關於鍊錶插入和刪除的注意事項
1.特殊處理鍊錶為空,或者鍊錶長度為1的情況。
2.注意插入操作的調整過程(需要找前後節點)
3.注意刪除操作的調整過程(需要找前後節點)
注意:頭尾節點及空節點需要特殊考慮。
雙鏈表的插入與刪除和單鏈表類似,但是需額外考慮previous指標的指向。
單鏈表的反轉操作
1、當鍊表為空或長度為1,特殊處理。
2.對一般情況,如下
已經反轉好的頭部為head,當前節點now。
環形鍊錶插值練習題
題幹:
給定鍊錶的資訊,結點值的陣列arr,下乙個結點值的位置的陣列nxt,和要插入的值num,要保證插入後這個環形單鏈表依然有序
要求時間複雜度為o(n),空間複雜度為o(1)
class
node:
def__init__
(self,data):
self.data = data
self.next = none
class
linklist:
def__init__
(self):
self.head = none
definsert
(self,arr,nxt,num):
node = node(num)
ifnot arr:
return node
#將陣列arr中的元素建立結點連線到temp上去
for i in range(len(arr)):
newnode = node(arr[nxt[i]])
ifnot self.head:
self.head = newnode
first = self.head
else:
self.head.next = newnode
self.head = newnode
#如果插入的num是最小值,則插入鍊錶的最前
if num < first.data:
self.head.next = node
node.next = first
return node
#插入兩個值之間
p = first
q = p.next
while q:
if p.data<=num and num<=q.data:
p.next = node
node.next = q
break
p = q
q = q.next
#若q為null,表示num是最大值,則插入最後乙個節點後
q.next = node
node.next = first
return first
總覺得這個有點毛病。。。。
訪問單個節點的刪除練習題
題幹:
給定乙個鍊錶中的結點node,但不給定整個鍊錶的頭結點。如何在鍊錶中刪除node?
請實現這個函式,要求時間複雜度為o(1)
解答:
典型的「狸貓換太子」, 若要刪除該節點,正常情況下,應該要知道該節點的前面節點的指標,但是由於單鏈表中沒有頭結點,所以無法追溯到該節點前面的那個節點,因此,這裡採用了「移花接木」的方法。設該節點為b,下乙個節點為c。那麼,首先將b節點的內容替換為c節點的內容,然後,將c節點刪除,這樣就達到了我們的目的。
但是這樣存在乙個問題,就是如果給定的該節點是最後乙個節點,將無法採取這種方法!
這種刪除方式並不是刪除了該刪除的結點,而是進行了值的拷貝,實際工程中不可取
如果能限制條件說,給定的node節點不是最後乙個節點,那麼刪除**如下所示:
class
node:
def__init__
(self,data):
self.data = data
self.next = none
class
linklist:
def__init__
(self,node):
p = node.next
if p == none:
node = none
else:
node.next = p.next
node.data = p.data
del p
直通BAT面試演算法精講 排序(1)
注 所有的 都是用python實現的,都是自己寫的,可能有些地方不太完善 時間複雜度 o n 2 空間複雜度 o 1 思想 依次訪問元素,逆序就置換。一趟排序後最大 小 的被置換到最後 def bubble sort arr,n ifnot arr return none for i in rang...
直通BAT面試演算法精講 排序(4)
荷蘭國旗問題 三色排序問題 對只包含0,1,2的整數陣列進行排序,要求使用交換 原地排序,而不是利用計數進行排序,做到0全在陣列左邊,1在中間,2在右邊 本題主要過程和快排劃分過程類似 測試用例 arr 1,1,0,0,2,1,1,0 輸出 0,0,0,1,1,1,1,2 解題思路 在陣列左側設定乙...
直通BAT面試演算法精講課1
1.有一棵二叉樹,請設計乙個演算法,按照層次列印這棵二叉樹。給定二叉樹的根結點root,請返回列印結果,結果按照每一層乙個陣列進行儲存,所有陣列的順序按照層數從上往下,且每一層的陣列內元素按照從左往右排列。保證結點數小於等於500。struct treenode class treeprinter ...