【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 = nextclass Solution:def swapPairs(self, p: Optional[ListNode]) -> Optional[ListNode]:head = ListNode(0, p)p = headwhile p.next and p.next.next:first, second, third = p.next, p.next.next, p.next.next.nextp.next, first.next, second.next = second, third, firstp = firstreturn head.next
同步发文于CSDN,原创不易,转载请附上原文链接哦~
Tisfy:https://letmefly.blog.csdn.net/article/details/132128294