---
# System prepended metadata

title: 24. Swap Nodes in Pairs
tags: [鏈結串列, 遞迴]

---

# 24. Swap Nodes in Pairs
###### tags: `鏈結串列` `遞迴`

https://leetcode.com/problems/swap-nodes-in-pairs/

[toc]

# 思路
1. 題目要看好，題目好像允許交換val ? 
2. swap 可以使用，這樣就不用maintain 一個tem 
```python=
            pre.val,cur.val=cur.val,pre.val
            
            #tem=pre.val 
            #pre.val =cur.val 
            #cur.val=tem 
            
```

3. 因為原本list就是連接的，所以遇到沒辦法換的，就直接break就好。
4. 邊際值要練系，例如如果head 和head.next都沒有怎麼辦，直接回傳head ，還有第三點說的，最尾端怎麼辦。
6. 


```python=
# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, val=0, next=None):
#         self.val = val
#         self.next = next
class Solution:
    def swapPairs(self, head: Optional[ListNode]) -> Optional[ListNode]:
        
        if not head or not head.next :
            return head 
        
        pre=head 
        cur=head.next 
        
        while pre and cur: 
            tem=pre.val 
            pre.val =cur.val 
            cur.val=tem 
            
            # 本來list 都是連接的，所以直接break 就好
            if  not cur.next or not cur.next.next : 
                break 
            pre=cur.next 
            cur=cur.next.next
        
        return head 
        
```

# 方法 ②：遞迴
稍微拆解一下題目，其實題目要做的事情是以兩個點為一組，完成以下操作：

將第一個點（head）指向第三個點（head.next.next）
將第二個點（head.next）指向第一個點（head）
可能會出類似以下的樣子：

```python=
head.next = head.next.next
head.next.next = head
```

但這樣寫可能會造成第二個點（head.next）被改寫，而失去原本的期待，因此需要先暫存第二的點：
```python=
next = head.next
head.next = next.next
next.next = head
```

以上這樣完成了一組的操作，為了讓所有點都可以依照此規則，可以加入遞迴的方法迭代：
```python=
next = head.next
head.next = swapPairs(next.next)
next.next = head

```

實作
```python=
class Solution:
    def swapPairs(self, head: Optional[ListNode]) -> Optional[ListNode]:
        if not head or not head.next: return head
        next = head.next # next 指向第二個點
        head.next = self.swapPairs(next.next) # head 指向第三個點
        next.next = head # next.next 指向第一個點
        return next
```