22
33https://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
6565JavaScript Code
6666
@@ -77,26 +77,62 @@ JavaScript Code
7777 * @return {ListNode}
7878 */
7979var 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
136172JavaScript Code
137173
@@ -148,20 +184,53 @@ JavaScript Code
148184 * @return {ListNode}
149185 */
150186var 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