leetcode24:两两交换链表中的节点

题目链接

leetcode

题目描述

给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。
在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。

C++ 代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
#include <iostream>
#include <vector>
using namespace std;

// 链表结点的定义
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) {}
};

// 辅助函数:创建链表
ListNode* createList(const vector<int>& nums) {
ListNode* dummy = new ListNode(-1);
ListNode* cur = dummy;
for (int num : nums) {
cur->next = new ListNode(num);
cur = cur->next;
}
return dummy->next;
}

// 辅助函数:打印链表
void printList(ListNode* head) {
while (head) {
cout << head->val;
if (head->next) cout << " -> ";
head = head->next;
}
cout << endl;
}

/*
递归实现
当前的两个结点进行交换,对后续的结点递归调用该函数继续交换。

时间复杂度:O(n)
其中 n 是链表的结点数量。对每个结点进行更新指针的操作。
空间复杂度:O(n)
主要取决于递归调用的栈空间。
*/
class Solution_0 {
public:
ListNode* swapPairs(ListNode* head) {
if (head == nullptr || head->next == nullptr) {
return head;
}

ListNode* node1 = head;
ListNode* node2 = head->next;
ListNode* node3 = node2->next;

node1->next = swapPairs(node3); // 1 指向递归返回的链表头节点
node2->next = node1; // 2 指向 1
return node2; // 返回交换后的链表头节点
}
};

/*
一个哑结点作为新的表头,一个指针 prev 来记录每对要交换结点的前一个结点。
每次循环找到当前的两个结点进行交换,即让 prev 的下一个结点变为第二个结点,
第一个结点指向原来第二个结点的下一个结点,第二个结点指向第一个结点,
然后更新 prev 为第一个结点,继续向后。

时间复杂度:O(n)
空间复杂度:O(1)
*/
class Solution {
public:
ListNode* swapPairs(ListNode* head) {
ListNode* dummy = new ListNode(-1);
dummy->next = head;
ListNode* cur = dummy;

while (cur->next != nullptr && cur->next->next != nullptr) {
ListNode *node1 = cur->next, *node2 = cur->next->next;
cur->next = node2;
node1->next = node2->next;
node2->next = node1;
cur = node1;
}

ListNode* res = dummy->next;
delete dummy;
return res;
}
};

int main() {
Solution solution;
vector<vector<int>> head_cases = {
{1,2,3,4},
{1,2,3,4,5},
{1},
{},
};

for (const auto& nums : head_cases) {
ListNode* head = createList(nums);
cout << "Input List: ";
printList(head);

head = solution.swapPairs(head);
cout << "Output List: ";
printList(head);
}

return 0;
}

leetcode24:两两交换链表中的节点
https://lcf163.github.io/2023/10/02/leetcode24:两两交换链表中的节点/
作者
乘风的小站
发布于
2023年10月2日
许可协议