給一個連結陣列,交換兩兩相鄰的節點並且回傳。
範例: 1->2->3->4, return 2->1->4->3。
你的演算法不能改變節點裡面的值,只能把節點搬來搬去。
這題要求我們將單鏈表的節點兩兩交換,並返回交換後的鏈表。這是一個鏈表操作問題,核心在於如何處理節點指針來實現交換。
具體步驟:
初始判斷:檢查鏈表是否至少有兩個節點可進行交換。如果鏈表為空或只有一個節點,直接返回原始鏈表。
更新頭節點:由於第一對節點的交換會更改頭節點,因此在交換第一對節點時,需要將第二個節點設為新的頭節點。
兩兩交換節點:
temp
來遍歷鏈表,每次操作一對節點,將下一對節點與當前操作的節點進行交換。終止條件:當剩下的節點數量少於兩個時,停止交換。
改進程式碼進一步提高可讀性,並保持原始解法的邏輯。
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* swapPairs(ListNode* head) {
// 如果鏈表為空或只有一個節點,直接返回原始鏈表
if (!head || !head->next) {
return head;
}
// 初始化新的頭節點,為原始頭節點的下一個節點
ListNode* newHead = head->next;
ListNode* temp = head;
// 遍歷並交換每一對節點
while (temp && temp->next) {
ListNode* nextPair = temp->next->next;
temp->next->next = temp; // 將下一個節點指向當前節點
if (nextPair && nextPair->next) {
temp->next = nextPair->next; // 將當前節點指向下一對的第二個節點
} else {
temp->next = nextPair; // 將當前節點指向下一對的第一個節點或NULL
}
temp = nextPair; // 繼續處理下一對節點
}
return newHead;
}
};