24-两两交换链表中的节点

image-20210502135928402

自己的做法

算法思想

先添加一个哨兵节点sentinel,初始时 指针node指向哨兵节点。判断哨兵节点后是否有两个节点。

如果有,则使用first和second指针指向这两个节点,首先:

  • node节点的next指向second
  • first节点的next指向second节点的next
  • second节点的next指向first

两个节点交换完毕。

然后node指向当前节点的下下个节点。

算法实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class Solution {
public:
static ListNode* swapPairs(ListNode* head) {
ListNode * sentinel = new ListNode();
sentinel->next = head;
ListNode * node = sentinel;
while (node->next != nullptr && node->next->next != nullptr) {
ListNode * first = node->next;
ListNode * second = node->next->next;

node->next = second;
first->next = second->next;
second->next = first;

node = node->next->next;
}
return sentinel->next;
}
};

性能分析

时间复杂度:O(N)O(N)

空间复杂度:O(1)O(1)

参考解法有两种解法。

第一种,使用递归,时间复杂度和空间复杂度都是O(n)O(n)

第二种和我的方法一样。


24-两两交换链表中的节点
https://zhaoquaner.github.io/2022/05/11/leetcode/链表/24-两两交换链表中的节点/
更新于
2022年5月22日
许可协议