直通BAT面試演算法精講 鍊錶(1)

2021-08-21 22:05:29 字數 2540 閱讀 2172

鍊錶問題知識點和注意事項

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 ...