你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。
方法1 递归:
思路:LeetCode题解 + 下方流程图(processon制作,流程图链接)
时间复杂度: O(N),其中 N 指的是链表的节点数量
空间复杂度: O(N),递归过程使用的堆栈空间
ListNode* swapPairs(ListNode* head) {
// 1.递归
if(head == NULL || head->next == NULL)
return head; //终止条件
ListNode* node = head->next;
head->next = swapPairs(head->next->next);
node->next = head;
return node;
// 2.交换值(不符合题目要求:不能改变节点内部的值)
// ListNode* quick = NULL; // error: head->next->next;
// ListNode* slow = head->next;
// while (slow != NULL)
// {
// quick = slow->next; // 先让quick等于slow下一个,循环最后slow跳next。
// int tmp = quick->val;
// quick->val = slow->val;
// slow->val = tmp;
// slow = quick->next;
// //quick = quick->next->next; // 不能直接在最后quick = quick->next->next;连续两个以上next有可能会报错,不好控制
// }
// return head;
}
方法2 迭代法:
思路:LeetCode题解 + 某大佬视频讲解 + 本人下方代码注释
时间复杂度: O(N),其中 N 指的是链表的节点数量
空间复杂度: O(1)
// 迭代法:
ListNode* swapPairs(ListNode* head) {
while (head != NULL && head->next != NULL) // 只有head和head后面,前后两个几点都不为NULL的时候才能进行节点的交换
{
ListNode* first = head;
ListNode* second = head->next;
// 处理每两个一组之间的反转
head->next = second->next; // 图片中的步骤①
second->next = first; // 图片中的步骤②
prev->next = second; // 图片中的步骤③ 错误:prev = second; // 虚拟头节点prev指向下一组的新的头节点
// 后移指针
prev = first; // 错误:prev = second; // 因为先前的first和second节点交换了位置(second在前,first在后),prev 相当于下一组两个待交换节点的first的前一个节点
head = first->next; // second -> first -> first1 -> second1 (假设下一组待交换节点的前一个为first1,后一个为second1),所以head重新指向下一组的first1
}
return virtualHead->next; // 返回最开始保留的虚拟头节点virtualHead的next
}