關於鍊錶的常見面試題一 (python詳解)

2021-10-07 13:01:23 字數 3888 閱讀 6036

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 的內中定義訪問函式,即是在這...