Skip to content

Commit d5ef00e

Browse files
committed
Add C++ code for 24.swap-nodes-in-pairs
1 parent 3391a90 commit d5ef00e

File tree

1 file changed

+116
-47
lines changed

1 file changed

+116
-47
lines changed

basic/linked-list/07.swap-nodes-in-pairs.md

Lines changed: 116 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -2,16 +2,16 @@
22

33
https://leetcode-cn.com/problems/swap-nodes-in-pairs/
44

5-
- [24. 两两交换链表中的节点](#24dot-两两交换链表中的节点)
5+
- [24. 两两交换链表中的节点](#24-两两交换链表中的节点)
66
- [题目描述](#题目描述)
7-
- [方法 1: 循环](#方法-1-循环)
7+
- [方法 1: 迭代](#方法-1-迭代)
88
- [图解](#图解)
99
- [复杂度分析](#复杂度分析)
10-
- [代码](#代码)
10+
- [代码(JavaScript/C++)](#代码javascriptc)
1111
- [方法 2: 递归](#方法-2-递归)
1212
- [思路](#思路)
1313
- [复杂度分析](#复杂度分析-1)
14-
- [代码](#代码-1)
14+
- [代码(JavaScript/C++)](#代码javascriptc-1)
1515

1616
## 题目描述
1717

@@ -46,21 +46,21 @@ https://leetcode-cn.com/problems/swap-nodes-in-pairs/
4646
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
4747
```
4848

49-
## 方法 1: 循环
49+
## 方法 1: 迭代
5050

5151
### 图解
5252

53-
- 要注意指针改变的顺序,不然可能会丢失节点。
54-
- 用一个 dummy 节点来简化操作,不用额外考虑链表头部的情况。
53+
- 要注意指针改变的顺序,不然可能会丢失节点。
54+
- 用一个 dummy 节点来简化操作,不用额外考虑链表头部的情况。
5555

5656
![](https://cdn.jsdelivr.net/gh/suukii/91-days-algorithm/assets/07.swap-nodes-in-pairs-02.png)
5757

5858
### 复杂度分析
5959

60-
- 时间复杂度:$O(N)$, N 为链表长度。
61-
- 空间复杂度:$O(1)$。
60+
- 时间复杂度:$O(N)$, N 为链表长度。
61+
- 空间复杂度:$O(1)$。
6262

63-
### 代码
63+
### 代码(JavaScript/C++)
6464

6565
JavaScript Code
6666

@@ -77,26 +77,62 @@ JavaScript Code
7777
* @return {ListNode}
7878
*/
7979
var swapPairs = function (head) {
80-
const dummy = new ListNode(null, head);
81-
let prev = dummy;
82-
let cur = prev.next;
83-
84-
while (cur && cur.next) {
85-
// 按照上图,指针更换顺序是这样子的
86-
// prev.next = cur.next
87-
// cur.next = prev.next.next
88-
// prev.next.next = cur
89-
90-
// 也可以先用一个指针把下一个节点存起来
91-
const next = cur.next;
92-
cur.next = next.next;
93-
next.next = cur;
94-
prev.next = next;
95-
96-
prev = cur;
97-
cur = cur.next;
80+
const dummy = new ListNode(null, head);
81+
let prev = dummy;
82+
let cur = prev.next;
83+
84+
while (cur && cur.next) {
85+
// 按照上图,指针更换顺序是这样子的
86+
// prev.next = cur.next
87+
// cur.next = prev.next.next
88+
// prev.next.next = cur
89+
90+
// 也可以先用一个指针把下一个节点存起来
91+
const next = cur.next;
92+
cur.next = next.next;
93+
next.next = cur;
94+
prev.next = next;
95+
96+
prev = cur;
97+
cur = cur.next;
98+
}
99+
return dummy.next;
100+
};
101+
```
102+
103+
C++ Code
104+
105+
```cpp
106+
/**
107+
* Definition for singly-linked list.
108+
* struct ListNode {
109+
* int val;
110+
* ListNode *next;
111+
* ListNode() : val(0), next(nullptr) {}
112+
* ListNode(int x) : val(x), next(nullptr) {}
113+
* ListNode(int x, ListNode *next) : val(x), next(next) {}
114+
* };
115+
*/
116+
class Solution {
117+
public:
118+
ListNode* swapPairs(ListNode* head) {
119+
if (head == nullptr || head->next == nullptr) return head;
120+
121+
ListNode* dummy = new ListNode(0, head);
122+
ListNode* prev = dummy;
123+
ListNode* cur = prev->next;
124+
125+
while (cur != nullptr && cur->next != nullptr) {
126+
ListNode* next = cur->next;
127+
cur->next = next->next;
128+
next->next = cur;
129+
prev->next = next;
130+
131+
prev = cur;
132+
cur = cur->next;
133+
}
134+
return dummy->next;
98135
}
99-
return dummy.next;
100136
};
101137
```
102138

@@ -116,22 +152,22 @@ var swapPairs = function (head) {
116152

117153
**小问题之间的关系**
118154

119-
- 下一个递归应该返回互换后的第一个节点
120-
- 当前递归应该返回互换后的第一个节点给上一个递归
155+
- 下一个递归应该返回互换后的第一个节点
156+
- 当前递归应该返回互换后的第一个节点给上一个递归
121157

122158
![](https://cdn.jsdelivr.net/gh/suukii/91-days-algorithm/assets/07.swap-nodes-in-pairs-01.png)
123159

124160
**递归出口**
125161

126-
- 链表尾部 `head === null`
127-
- 链表最后只剩下一个元素 `head.next === null`
162+
- 链表尾部 `head === null`
163+
- 链表最后只剩下一个元素 `head.next === null`
128164

129165
### 复杂度分析
130166

131-
- 时间复杂度:$O(N)$, N 为链表长度。
132-
- 空间复杂度:$O(N)$, N 为链表长度,递归栈的空间。
167+
- 时间复杂度:$O(N)$, N 为链表长度。
168+
- 空间复杂度:$O(N)$, N 为链表长度,递归栈的空间。
133169

134-
### 代码
170+
### 代码(JavaScript/C++)
135171

136172
JavaScript Code
137173

@@ -148,20 +184,53 @@ JavaScript Code
148184
* @return {ListNode}
149185
*/
150186
var swapPairs = function (head) {
151-
// 递归出口
152-
if (!head || !head.next) return head;
187+
// 递归出口
188+
if (!head || !head.next) return head;
189+
190+
// 先保存下一个节点,避免丢失
191+
const next = head.next;
192+
193+
// 下一个递归会返回互换后的第一个节点
194+
// head 是当前组互换后的第二个节点,head.next 指向下一组就好
195+
head.next = swapPairs(next.next);
196+
197+
// 将当前组的两个节点互换
198+
next.next = head;
153199

154-
// 先保存下一个节点,避免丢失
155-
const next = head.next;
200+
// 返回互换后的第一个节点
201+
return next;
202+
};
203+
```
204+
205+
C++ Code
206+
207+
```cpp
208+
/**
209+
* Definition for singly-linked list.
210+
* struct ListNode {
211+
* int val;
212+
* ListNode *next;
213+
* ListNode() : val(0), next(nullptr) {}
214+
* ListNode(int x) : val(x), next(nullptr) {}
215+
* ListNode(int x, ListNode *next) : val(x), next(next) {}
216+
* };
217+
*/
218+
class Solution {
219+
public:
220+
ListNode* swapPairs(ListNode* head) {
221+
if (head == nullptr || head->next == nullptr) return head;
222+
223+
ListNode* first = head;
224+
ListNode* second = first->next;
156225

157-
// 下一个递归会返回互换后的第一个节点
158-
// head 是当前组互换后的第二个节点,head.next 指向下一组就好
159-
head.next = swapPairs(next.next);
226+
ListNode* head_of_next_group = swapPairs(second->next);
160227

161-
// 将当前组的两个节点互换
162-
next.next = head;
228+
first->next = head_of_next_group;
229+
second->next = first;
163230

164-
// 返回互换后的第一个节点
165-
return next;
231+
return second;
232+
}
166233
};
167234
```
235+
236+
更多题解可以访问:[https://github.com/suukii/91-days-algorithm](https://github.com/suukii/91-days-algorithm)

0 commit comments

Comments
 (0)