面試中被問鍊錶的題目我就不再多說,直接總結題目。
1、將鍊錶逆序
這個問題很早就研究過,但後來一次面試的時候我突然緊張忘了,沒答上來。
我不知道大家的解法是什麼,我的解法是遍歷鍊錶是用前插發插入節點,最後的鍊錶就是逆序的。
[python]view plain
copy
class
listnode:
def__init__(
self
, x):
self
.val = x
self
.next =
none
class
solution:
defresverse(
self
, head):
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.判斷單鏈表是否帶環?若帶環,求環的長度?求環的入口點?並計算每個演算法的時間複雜度 空間複雜度。思路 利用快慢指標,快指標一次走兩步,慢指標一次走一步,如快慢指標有相遇點,則一定有環。找到相遇點後,求環長度問題,可以轉換為求頭結點到 相遇點之間的長度問題。求入口點時,讓快指標回到頭結點,兩指標再...