【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。
0 -> 1 -> 2 -> 3
已| 正在 |未
对于本题,我们可以使用4个临时变量:
p
指向已经处理过的部分的最后一个节点(0)first
指向待处理的第一个节点(1)second
指向待处理的第二个节点(2)third
指向还未处理到的第一个节点(4,可能为空)
由于需要进行如下更改:
0 -> 1 -> 2 -> 3
| |
| ↓ |
| |
0 -> 2 -> 1 -> 3
所以只需要:
p->next = second
first->next = third
second->next = first
这样,原本的1 -> 2
就处理完毕了,下一个待处理节点变成3 -> ...
,第一个未处理的节点变成了1
所以只需p = first
即可。
细节处理:
我们可以添加一个临时的头节点,代表“已处理部分的最后一个节点”,最终返回临时头节点的next即可。
- 时间复杂度 O ( l e n ( l i s t ) ) O(len(list)) O(len(list))
- 空间复杂度 O ( 1 ) O(1) O(1)
AC代码
C++
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
# 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