###### 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; } }; ```