一、刷题部分
1.1 24. 两两交换链表中的节点
- 原文链接:代码随想录
- 题目链接:24. 两两交换链表中的节点 - 力扣(LeetCode)
1.1.1 题目描述
给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。
示例 1:
输入:head = [1,2,3,4]
输出:[2,1,4,3]
示例 2:
输入:head = []
输出:[]
示例 3:
输入:head = [1]
输出:[1]
提示:
- 链表中节点的数目在范围
[0, 100]
内 0 <= Node.val <= 100
1.1.2 初见想法
这其实是上一题的更复杂版本,每一次更改需要涉及交换的 2 个节点以及前后 2 个节点共 4 个节点的操作。如果有了上一题的扎实基础的话,这题写起来应该非常轻松的。
/**
* 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) {
//考虑节点个数为0或1的情况
if (head == nullptr) {
return head;
}
if (head -> next == nullptr) {
return head;
}
ListNode* pre = nullptr;
ListNode* cur1 = head;
ListNode* cur2 = head -> next;
ListNode* nxt = nullptr;
head = cur2;
//开始交换
while (true) {
nxt = cur2 -> next;
//考虑一开始pre节点是nullptr的情况
if (pre != nullptr) {
pre -> next = cur2;
}
cur2 -> next = cur1;
cur1 -> next = nxt;
//若本次是最后一次
if (nxt == nullptr || nxt -> next == nullptr) {
break;
}
//确定不是最后一遍循环可以放心地节点指针整体后移2位
pre = cur1;
cur1 = nxt;
cur2 = nxt -> next;
}
return head;
}
};
也确实如我所料,写起来流畅并且运行通过。接下来看看录里有没有新东西。
1.1.3 看录后想法
感觉录里的写法总是比我简洁呢,虽然思路都是差不多的。把 pre 和 nxt 作为两个临时指针,只关心 cur1 和 cur2的操作,剩下的两个指针每次更新就行。