力扣 Hot 100 刷题记录 - 两两交换链表中的节点
题目描述
两两交换链表中的节点 是力扣 Hot 100 中的一道经典题目,题目要求如下:
给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部值的情况下完成本题(即只能进行节点交换)。
示例 1:
输入:head = [1,2,3,4]
输出:[2,1,4,3]
示例 2:
输入:head = []
输出:[]
示例 3:
输入:head = [1]
输出:[1]
解题思路
这道题的核心是通过指针操作交换相邻的两个节点。需要注意以下几点:
-
虚拟头节点:
- 使用虚拟头节点
dummy
简化边界条件处理,特别是头节点的交换。
- 使用虚拟头节点
-
指针操作:
- 定义三个指针:
prev
、curr
和next
,分别表示前一个节点、当前节点和下一个节点。 - 通过调整指针的指向,完成两个节点的交换。
- 定义三个指针:
-
遍历链表:
- 每次交换两个节点后,移动
prev
指针到下一组节点的前一个位置。
- 每次交换两个节点后,移动
-
边界条件:
- 如果链表长度为奇数,最后一个节点不需要交换。
C++ 代码实现
/*** 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) {ListNode* dummy = new ListNode(0); // 虚拟头节点dummy->next = head;ListNode* prev = dummy; // 前一个节点while (prev->next && prev->next->next) {ListNode* curr = prev->next; // 当前节点ListNode* next = curr->next; // 下一个节点// 交换节点prev->next = next;curr->next = next->next;next->next = curr;// 移动 prev 指针prev = curr;}return dummy->next; // 返回新链表的头节点}
};