和鍊錶有關面試題

2021-07-08 19:38:42 字數 4141 閱讀 2181

面試中被問鍊錶的題目我就不再多說,直接總結題目。

1、將鍊錶逆序

這個問題很早就研究過,但後來一次面試的時候我突然緊張忘了,沒答上來。

我不知道大家的解法是什麼,我的解法是遍歷鍊錶是用前插發插入節點,最後的鍊錶就是逆序的。

[python]view plain

copy

class

listnode:  

def__init__(

self

, x):  

self

.val = x  

self

.next = 

none

class

solution:  

defresverse(

self

, head):  

print

id(head)  

ifnone

== head 

ornone

== head.next:  

return

head  

p = head.next  

head.next = none

while

none

!= p:  

q = p.next  

p.next = head  

head = p  

p = q  

return

head  

2、判斷鍊錶中是否有環

這個問題似乎是有固定的解法即就是設定快、慢兩個指標,若指標能相遇,則說明有環,如果慢指標為 none了,就說明沒有環

[python]view plain

copy

class

listnode:  

def__init__(

self

, x):  

self

.val = x  

self

.next = 

none

class

solution:  

defhascycle(

self

, head):  

ifnone

== head 

ornone

== head.next:  

return

false

p = head  

q = head.next  

while

q != 

none

andp != q:  

p = p.next  

q = q.next  

ifnone

!= q:  

q = q.next  

return

p == q  

3、既然鍊錶中有環,求取環的長度

仔細想想,這其實和我們小學的追擊問題是一樣的,甲乙相遇的條件是 s甲 - s2 = n * 周長。另外,因為已經找到了環上的乙個點,那麼直接從該點開始,下次到該點時所走長度就是環的長度。

[python]view plain

copy

class

solution:  

defcyclelen(

self

, head):  

ifnone

== head 

ornone

== head.next:  

return

0p = head  

q = head.next  

while

q != 

none

andp != q:  

p = p.next  

q = q.next  

ifnone

!= q:  

q = q.next  

ifp != q:  

return

0ret_len = 1

p = p.next  

while

p != q:  

ret_len += 1

p = p.next  

return

ret_len  

4、判斷兩個鍊錶的第乙個公共點

求公共節點的時候需要分三種情況:兩個都沒環,乙個有環,兩個都沒環,後兩種先不討論了。

[python]view plain

copy

class

listnode:  

def__init__(

self

, x):  

self

.val = x  

self

.next = 

none

class

solution:  

defgetlen(

self

, head):  

len = 0

while

head != 

none

:  len += 1

head = head.next  

return

len  

defgetcommonnode(

self

, head1, head2):  

len1 = self

.getlen(head1)  

len2 = self

.getlen(head2)  

p = head1  

q = head2  

while

len1 - len2 > 

0:  

p = p.next  

len1 -= 1

while

len1 - len2 < 

0:  

q = q.next  

len2 -= 1

while

p != 

none

:  if

p == q:  

return

q  p = p.next  

q = q.next  

pass

5、單向鍊錶中,如何在給定節點前快速插入乙個節點?

大家都知道,鍊錶插入節點時必須要得到插入位置的前乙個節點,但這道題中並沒有給出,那麼我們是不是應該再遍歷一次,找到插入位置的前乙個節點?這樣是可行的,但不是面試官想要的。那麼應該怎樣做呢?換個角度,我們在當前節點前插入節點是很難的,但是在當前節點後插入節點又是很容易的,所以我們可以先將節點插入到當前節點之後,然後交換一下資料。

[python]view plain

copy

class

listnode:  

def__init__(

self

, x):  

self

.val = x  

self

.next = 

none

class

solution:  

definsertnode(

self

, index, node):  

node.next = index.next  

index.next = node  

index.val, node.val = node.val, index.val  

6、對於乙個陣列,將所有奇數移動到偶數前面

[python]view plain

copy

deffun(

self

, arr):  

p = 0

q = len(arr) - 1

while

p < q:  

while

p < q 

andarr[p] & 

0x01

!= 0

:  p += 1

while

p < q 

andarr[q] & 

0x01

== 0

:  q -= 1

arr[p], arr[q] = arr[q], arr[p]  

有關鍊錶的面試題(再續)

今天讓我們來做一些複雜一些的鏈表面試題。1.複雜鍊錶的復刻。typedef struct cn cn cn copy cn pfirst 2.複製prandom。for pnode pfirst pnode null pnode pnode pnext pnext 3.拆鍊錶。for pnode p...

有關鍊錶的經典面試題 (一)

1.比較順序表和煉表的優缺點,說說它們分別在什麼場景下使用?順序表 記憶體中位址連續,優點是隨機訪問比較便捷快速,建立也比較簡單,隨機查詢比較方便,可以直接給出下標,排序也方便 簡單。缺點 不夠靈活,刪除增加的工作量叫大,比較麻煩,長度不能實時變化 適用場景 適用於需要大量訪問元素的 而少量增添 刪...

有關鍊錶的經典面試題(二)

1.判斷單鏈表是否帶環?若帶環,求環的長度?求環的入口點?並計算每個演算法的時間複雜度 空間複雜度。思路 利用快慢指標,快指標一次走兩步,慢指標一次走一步,如快慢指標有相遇點,則一定有環。找到相遇點後,求環長度問題,可以轉換為求頭結點到 相遇點之間的長度問題。求入口點時,讓快指標回到頭結點,兩指標再...