給你一個鏈表,兩兩交換其中相鄰的節點,并返回交換后鏈表的頭節點。你必須在不修改節點內部的值的情況下完成本題(即,只能進行節點交換)。
示例 1:
輸入:head = [1,2,3,4] 輸出:[2,1,4,3]
示例 2:
輸入:head = [] 輸出:[]
示例 3:
輸入:head = [1] 輸出:[1]
提示:
- 鏈表中節點的數目在范圍?
[0, 100]
?內 0 <= Node.val <= 100
代碼:
/*** 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 *dummyhead = new ListNode(0);dummyhead->next = head;ListNode *cur = dummyhead;while(cur->next != nullptr && cur->next->next != nullptr){ListNode *temp1 = cur->next;ListNode *temp2 = cur->next->next->next;cur->next = cur->next->next;cur->next->next = temp1;temp1->next = temp2;cur = cur->next->next;}head = dummyhead->next;delete dummyhead;return head;
}
};
解題思路:
(1)設置虛擬頭節點,防止頭部的判斷。
(2)設置臨時節點,保存暫時不被指向的節點。
(3)以第一輪為例,首先,將虛擬頭節點指向第二個節點。接著,將第二個節點指向第一個節點。最后,將第一個節點指向第三個節點。
(4)兩兩向后遍歷。
(5)鏈表就是指向的游戲,注意虛擬頭節點,以及臨時節點的保存