給定乙個鍊錶,兩兩交換其中相鄰的節點,並返回交換後的鍊錶。
你不能只是單純的改變節點內部的值,而是需要實際的進行節點交換。
輸入:head = [1,2,3,4]暴力法通常需要建立乙個新的煉表頭來儲存結果,並因為需要做指標的交換,設定乙個空節點去連線head是很有幫助的。這道題需要注意判斷結束迴圈的條件,考慮鍊錶的節點個數是奇偶數的情況,理清楚交換指標的順序。看下面**輸出:[2,1,4,3]
遞迴法不需要建立新結點,但是一定要搞清楚結束條件,還有遞迴層要做什麼
暴力法:
建立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 ...