---
# System prepended metadata

title: 'LeetCode #24 [Swap Nodes in Pairs](https://leetcode.com/problems/swap-nodes-in-pairs/)'
tags: [LeetCode, Medium, Linked List]

---

###### tags: `LeetCode` `Linked List` `Medium` 
# LeetCode #24 [Swap Nodes in Pairs](https://leetcode.com/problems/swap-nodes-in-pairs/)
### (Medium)

給定一個鏈結串列，兩兩交換其中相鄰的節點，並返回交換後的鏈結串列。

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

![](https://i.imgur.com/j73mMOJ.png)

---
訓練邏輯的題目, 解題方法並沒有什麼用。

大概要做的事情, 以圖中為例, 要讓1指向3(2的下一個), 2指向1, 然後用一個指標prev紀錄1, 並進行下一輪。下一輪中, 將3指向4的下一個(nullptr), 並將4指向3, 再將prev指向4, 所以總共需要2個指標加上一個回傳指標來完成。

當tmp指標為空指標時, 代表為總共奇數個鏈結節點並已經進行到最後一組, 同時最後一組只有一個節點, 此時直接跳出迴圈即可。

---
```
/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode() : val(0), next(nullptr) {}
 *     ListNode(int x) : val(x), next(nullptr) {}
 *     ListNode(int x, ListNode *next) : val(x), next(next) {}
 * };
 */
class Solution {
public:
    ListNode* swapPairs(ListNode* head) {
        ListNode *prev = nullptr, *ans = nullptr, *tmp = nullptr;
        if(!head)return nullptr;
        else if(!head->next)return head;
        while(head){
            tmp = head->next;
            if(!tmp)break;
            head->next=tmp->next;
            tmp->next=head;
            if(!prev){
                ans = tmp;
                prev = head;
            }
            else {
                prev->next = tmp;
                prev = head;
            }
            head = head->next;
        }
        return ans;
    }
};
```