题目描述
给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。
你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。
样例
给定 1->2->3->4, 你应该返回 2->1->4->3.
算法1
(迭代模拟) $O(n)$
链表题,就画个图模拟一下,好像没什么特殊的技巧。
时间复杂度
遍历整个链表即可,时间复杂度$O(n)$.
参考文献
C++ 代码
/**
* 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) {
if (!head || !head->next) return head;
ListNode *dummy = new ListNode(0), *p = dummy;
dummy->next = head;
while (true){
if (!p->next) break;
ListNode *first = p->next;
if (!first->next) break;
ListNode *second = first->next;
first->next = second->next;
second->next = first;
p->next = second;
p = first;
}
p = dummy->next;
delete dummy; dummy = nullptr;
return p;
}
};
算法2
(递归) $O(n)$
迭代模拟很麻烦,其实可以递归求解。
时间复杂度
参考文献
C++ 代码
class Solution {
public:
ListNode* swapPairs(ListNode* head) {
if(!head || !head->next) return head;
ListNode *node = head->next;
head->next = swapPairs(node->next);
node->next = head;
return node;
}
};