24.两两交换链表中的节点:粗暴易懂的方法(几个临时变量)

【LetMeFly】24.两两交换链表中的节点:粗暴易懂的方法(几个临时变量)

力扣题目链接:https://leetcode.cn/problems/swap-nodes-in-pairs/

给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。

 

示例 1:

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

示例 2:

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

示例 3:

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

 

提示:

  • 链表中节点的数目在范围 [0, 100]
  • 0 <= Node.val <= 100

方法一:粗暴易懂的方法(几个临时变量)

遇到链表的题不用怕,可以先用几个临时变量将需要记录的节点记录下来,之后随意更改要重新指向的next

1
2
0 -> 1 -> 2 -> 3
已| 正在 |未

对于本题,我们可以使用4个临时变量:

  1. p指向已经处理过的部分的最后一个节点(0)
  2. first指向待处理的第一个节点(1)
  3. second指向待处理的第二个节点(2)
  4. third指向还未处理到的第一个节点(4,可能为空)

由于需要进行如下更改:

1
2
3
4
5
0 -> 1 -> 2 -> 3
| |
| ↓ |
| |
0 -> 2 -> 1 -> 3

所以只需要:

  1. p->next = second
  2. first->next = third
  3. second->next = first

这样,原本的1 -> 2就处理完毕了,下一个待处理节点变成3 -> ...,第一个未处理的节点变成了1

所以只需p = first即可。

细节处理:

我们可以添加一个临时的头节点,代表“已处理部分的最后一个节点”,最终返回临时头节点的next即可。

  • 时间复杂度$O(len(list))$
  • 空间复杂度$O(1)$

AC代码

C++

1
2
3
4
5
6
7
8
9
10
11
12
13
class Solution {
public:
ListNode* swapPairs(ListNode* p) {
ListNode* head = new ListNode(0, p);
p = head;
while (p->next && p->next->next) {
ListNode* first = p->next, *second = first->next, *third = second->next;
p->next = second, first->next = third, second->next = first;
p = first;
}
return head->next;
}
};

Python

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# from typing import Optional

# # Definition for singly-linked list.
# class ListNode:
# def __init__(self, val=0, next=None):
# self.val = val
# self.next = next

class Solution:
def swapPairs(self, p: Optional[ListNode]) -> Optional[ListNode]:
head = ListNode(0, p)
p = head
while p.next and p.next.next:
first, second, third = p.next, p.next.next, p.next.next.next
p.next, first.next, second.next = second, third, first
p = first
return head.next

同步发文于CSDN,原创不易,转载请附上原文链接哦~
Tisfy:https://letmefly.blog.csdn.net/article/details/132128294


24.两两交换链表中的节点:粗暴易懂的方法(几个临时变量)
https://blog.letmefly.xyz/2023/08/06/LeetCode 0024.两两交换链表中的节点/
作者
Tisfy
发布于
2023年8月6日
许可协议