leecode 24 兩兩交換鍊錶中的節點

2021-10-24 20:28:11 字數 2839 閱讀 2267

給定乙個鍊錶,兩兩交換其中相鄰的節點,並返回交換後的鍊錶。

你不能只是單純的改變節點內部的值,而是需要實際的進行節點交換。

輸入:head = [1,2,3,4]

輸出:[2,1,4,3]

暴力法通常需要建立乙個新的煉表頭來儲存結果,並因為需要做指標的交換,設定乙個空節點去連線head是很有幫助的。這道題需要注意判斷結束迴圈的條件,考慮鍊錶的節點個數是奇偶數的情況,理清楚交換指標的順序。看下面**

遞迴法不需要建立新結點,但是一定要搞清楚結束條件,還有遞迴層要做什麼

暴力法:

建立dhead作為頭結點,把head拼接上去,temp指標指向dhead用於移動迴圈鍊錶。結束條件是偶數情況temp指標後面沒有元素了,奇數情況是temp指標的後面的後面。 為了避免自己寫next寫到頭暈,所以設定了node1和node2。拆指標的三句根據**去看,這樣寫才不會找不到下乙個節點,千萬別弄錯順序,交換完成後,把temp指標後移。

遞迴法:

h是head,n是newhead,是按照這種步驟執行,能看懂嗎?

1--->2--->3--->4

h n

1--->2--->3--->4

h n

4--->3--->none (newhead.next = head)

回到head為1,n為2的遞迴層,

2--->1--->4--->3--->none (newhead.next = head )

(暴力法)

class

solution

:def

(self, head: listnode)

-> listnode:

dhead = listnode(

) dhead.

next

= head

temp = dhead

while temp.

next

and temp.

next

.next

: node1 = temp.

next

node2 = temp.

next

.next

temp.

next

= node2

node1.

next

= node2.

next

node2.

next

= node1

temp = node1

return dhead.

next

(暴力法的簡寫版本):

class

solution

:def

(self, head: listnode)

-> listnode:

node = temp = listnode(

next

=head)

while temp.

next

and temp.

next

.next

: temp.

next

.next

.next

, temp.

next

.next

, temp.

next

, temp = temp.

next

, temp.

next

.next

.next

, temp.

next

.next

, temp.

next

return node.

next

(遞迴法)

class

solution

:def

(self, head: listnode)

-> listnode:

if head ==

none

or head.

next

==none

:return head

newhead = head.

next

head.

next

next

) newhead.

next

= head

return newhead

復 雜度

分析:\color

複雜度分析:

時間複雜度:o(n),其中 nn 是鍊錶的節點數量。需要對每個節點進行更新指標的操作。

空間複雜度:o(1)。

為什麼需要temp.next and temp.next.next?

temp.next是判斷有偶數個結點的情況,temp.next.next是判斷有奇數個結點的情況。如果我們少寫了其中乙個情況,就會因為none是沒有next而報錯。它們的順序是不能調換的,因為當你遇到偶數情況,因為python是按照順序執行的,而temp.next是個none,none沒有next,這樣也是會報錯的。至於為什麼是and,這個就很好解釋了,你如果寫了or,那麼奇數情況不就等於形同虛設嗎?因為肯定滿足temp.next的。

兩兩交換鍊錶節點24

方法一 迭代 我們把鍊錶分為兩部分,即奇數節點為一部分,偶數節點為一部分,a 指的是交換節點中的前面的節點,b 指的是要交換節點中的後面的節點。在完成它們的交換,我們還得用 prevnode 記錄 a 的前驅節點。演算法 1.firstnode 即 a 和 secondnode 即 b 分別遍歷偶數...

24 兩兩交換鍊錶中的節點

給定乙個鍊錶,兩兩交換其中相鄰的節點,並返回交換後的鍊錶。示例 給定 1 2 3 4,你應該返回 2 1 4 3.說明 你的演算法只能使用常數的額外空間。你不能只是單純的改變節點內部的值,而是需要實際的進行節點交換。要求從前往後,兩兩交換,意味著每一組的第二個指向的下乙個也應該是交換過了的,自然想到...

24 兩兩交換鍊錶中的節點

給定乙個鍊錶,兩兩交換其中相鄰的節點,並返回交換後的鍊錶。你不能只是單純的改變節點內部的值,而是需要實際的進行節點交換。給定 1 2 3 4,你應該返回 2 1 4 3.definition for singly linked list.class listnode def init self,x ...