难度中等793
给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。
你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。
示例 1:
输入:head = [1,2,3,4] 输出:[2,1,4,3]示例 2:
输入:head = [] 输出:[]示例 3:
输入:head = [1] 输出:[1]
提示:
- 链表中节点的数目在范围
[0, 100]
内0 <= Node.val <= 100
进阶:你能在不修改链表节点值的情况下解决这个问题吗?(也就是说,仅修改节点本身。)
1. 迭代
这个和我想法一模一样,可惜我自己能力还很欠缺没能实现,原因在于,我没有用到前驱,只用了两个节点。
这个方法里面用到了tmp节点相当于是前驱这样的角色,然后每次node1 和 node2 交换后,把tmp 指向到node1 节点位置,依次进行下一个循环。
还有一个学习的地方,这个while循环的判断条件比我写的要严格。确实应该判断的是两个节点都不能空,我当时只判断了第二个接地那不能空。
这个题目还是学习到了,也把自己思路和实现捋了捋。加油!
/**
* 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* dummy = new ListNode(0, head);
ListNode* tmp = dummy;
while(tmp->next != nullptr && tmp->next->next != nullptr){
ListNode* node1 = tmp->next;
ListNode* node2 = tmp->next->next;
tmp->next = node2;
node1->next = node2->next;
node2->next = node1;
tmp = node1;
}
return dummy->next;
}
};
2、递归
这个递归我没太看明白代码,思路是知道的,递归啊。。。
/**
* 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) {
if(head == nullptr || head->next == nullptr){
return head;
}
ListNode* newNode = head->next;
head->next = swapPairs(newNode->next);
newNode->next = head;
return newNode;
}
};