题目描述
给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。
你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。
示例:
给定 1->2->3->4, 你应该返回 2->1->4->3.
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/swap-nodes-in-pairs
思路
将一个链表两个两个地进行翻转。
为了方便我们可以设置一个哑结点dummy。用currNode指向当前需要翻转的第一个节点,postNode指向当前需要翻转的第二个节点,并用preNode指向currNode的前一个节点。
然后交换currNode、postNode两个节点即可,再将指针向右移进行下一次翻转。
时间复杂度O(n),空间复杂度O(1)
c++
/**
* 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 == nullptr || head->next == nullptr) return head;
ListNode dummy(-1);
dummy.next = head;
ListNode *preNode = &dummy, *currNode = preNode->next, *postNode = currNode->next;
while(postNode){
preNode->next = postNode;
currNode->next = postNode->next;
postNode->next = currNode;
preNode = currNode;
currNode = currNode->next;
postNode = currNode != nullptr ? currNode->next : nullptr;
}
return dummy.next;
}
};