LeetCode_24_两两交换链表中的节点
廖家龙 用心听,不照做

题目描述:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
一般来说,算法题不需要删除内存,在刷LeetCode的时候,如果想要删除一个节点,可以直接进行指针操作而无需回收内存。实际做软件工程时,对于无用的内存,建议尽量显式回收,或利用智能指针

给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。

示例:
输入:head = [1,2,3,4]
输出:[2,1,4,3]

输入:head = []
输出:[]

输入:head = [1]
输出:[1]

提示:
1. 链表中节点的数目在范围 [0, 100] 内
2. 0 <= Node.val <= 100

解法1:迭代

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
/**
* 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) {

ListNode* dummyHead = new ListNode(0,head);
ListNode* temp = dummyHead;

while (temp->next != nullptr && temp->next->next != nullptr) {

ListNode* node1 = temp->next;
ListNode* node2 = temp->next->next;

temp->next = node2;
node1->next = node2->next;
node2->next = node1;

temp = node1;
}

return dummyHead->next;
}
};