1.鍊錶與陣列的區別?
訪問:陣列通過下標可「隨機訪問」,時間複雜度為o(1),鍊錶需要從第乙個元素「順序訪問」,時間複雜度為o(n),
當插入或刪除元素時陣列需要移動大量元素,鍊錶只需修改元素的指標
2.翻轉鍊錶(遞迴、迭代方法)
根據陣列建立乙個鍊錶,將鍊錶輸出
#定義單鏈表節點
class
listnode
:def
__init__
(self,x)
: self.val=x
self.
next
=none
#根據陣列建立乙個單鏈表
defcreat_listnode
(nums)
: head=pre=listnode(nums[0]
)for num in nums[1:
]:pre.
next
=listnode(num)
pre=pre.
next
return head
#將鍊錶輸出為陣列
defprint_listnode
(head)
: list_node=
while head:
head=head.
next
return list_node
# 反轉乙個單鏈表
# 輸入: 1->2->3->4->5->null
# 輸出: 5->4->3->2->1->null
#定義單鏈表節點
class
listnode
:def
__init__
(self,x)
: self.val=x
self.
next
=none
#反轉鍊錶:雙指標迭代
defreverse_listnode
(head):if
not head:
return
pre,cur=
none
,head
while cur:
tmp=cur.
next
cur.
next
=pre
pre=pre.
next
cur=tmp
return pre
#遞迴defrecursion_reverse
(head)
:#遞迴終止條件
ifnot head or
not head.
next
:return head
#此時的cur為最後乙個節點
cur=self.recursion_reverse(head.
next
)#翻轉當前節點
head.
next
.next
=head
# 防止鍊錶迴圈,將head.next設為空
head.
next
=none
#每次遞迴返回最後乙個節點
return cur
2.鍊錶中是否有環?環的起點?
建立乙個帶環的鍊錶
#建立乙個帶環的鍊錶
class
listnode
:def
__init__
(self,x)
: self.val=x
self.
next
=none
head = listnode(0)
p1 = listnode(1)
p2 = listnode(2)
p3 = listnode(3)
p4 = listnode(4)
p5 = listnode(5)
head.
next
= p1
p1.next
= p2
p2.next
= p3
p3.next
= p4
p4.next
= p5
p5.next
= p2
快慢指標法:快指標每走兩步,慢指標走一步,若相遇則存在環def
exit_loop
(head)
:#定義兩個指標
fast=slow=head
while fast.
next
.next
and slow,
next
: fast=fast.
next
.next
slow=slow.
next
if fast==slow:
return
true
return
false
尋找環的起點:兩指標乙個從起點出發,乙個指標從第一次相遇點出發,兩指標再次相遇點即為環的起點def
start_loop
(head)
: fast=slow=head
while fast.
next
.next
and slow.
next
: fast=fast.
next
.next
slow=slow.
next
#找到第一次相遇點
if fast==slow:
break
#乙個指標從起點出發,另乙個從相遇點出發
fast=head
while fast.
next
and slow.
next
: fast,slow=fast.
next
,slow.
next
if fast==slow:
return slow.val
3.移除鍊錶中的節點
1)移除鍊錶中的指定節點
def
remove_node
(head,val):if
not head:
return head
if head.val==val:
return head.
next
pre,cur=head,head.
next
#找到刪除節點的位置(cur指標所指的位置)
while cur and cur.val!=val:
pre,cur=pre.
next
,cur.
next
#在遍歷鍊錶結束前,找到刪除位置
if cur:
pre.
next
=cur.
next
return head
2)移除順序鍊錶中的重複節點def
remove_repeat
(head):if
not head:
return head
pre,post=head,head.
next
while post:
#若兩指標節點值相等,刪除
if pre.val==post.val:
pre.
next
=post.
next
post=post.
next
#不相等,兩指標分別後移
else
: pre,post=pre.
next
,post.
next
return head
鍊錶常見面試題
1 如何判斷乙個單鏈表有環 2 如何判斷乙個環的入口點在 3 如何知道環的長度 4 如何知道兩個單鏈表 無環 是否相交 5 如果兩個單鏈表 無環 相交,如何知道它們相交的第乙個節點是什麼 6 如何知道兩個單鏈表 有環 是否相交 7 如果兩個單鏈表 有環 相交,如何知道它們相交的第乙個節點是什麼 1 ...
鍊錶的常見面試題
鍊錶的基本操作 逆序列印單鏈表 刪除鍊錶的非尾結點,要求 不能遍歷鍊錶 在鍊錶pos位置前插入值到data的結點 查詢鍊錶的中間結點,要求只能遍歷一次鍊錶 查詢鍊錶的倒數第k個結點,要求只能遍歷一次鍊錶 刪除鍊錶的倒數第k個結點,要求只能遍歷一次鍊錶 用單鏈表實現約瑟夫環 鍊錶的逆置 三個指標 鍊錶...
常見面試題一
1.下列程式在32位 linux 或unix 中的結果是什麼?func char str main 答 10 4 9 這個也就是說sizeof 來計算的時候,要在字串後面加乙個 0,而 strlen 不加。其他str 為乙個指標,故 sizeof str 為4 2 在c 的內中定義訪問函式,即是在這...