题目链接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题解思路思路虚拟头节点 为了简化边界条件如链表为空或只有一个节点创建一个虚拟头节点virtualHead其next指向原链表头head。这样处理后链表操作无需单独判断头节点。双指针遍历 使用指针cur从virtualHead开始遍历链表。每次处理两个相邻节点cur-next和cur-next-next保存关键节点temp保存当前节点cur-next第一个节点。temp1保存cur-next-next-next交换后第一个节点的后续链表。交换节点将cur-next指向cur-next-next即第二个节点。将cur-next-next指向temp即第一个节点。将temp-next指向temp1连接后续链表。移动指针cur移动到交换后的第二个节点即cur-next-next为下一次交换做准备。边界处理循环条件cur-next ! nullptr cur-next-next ! nullptr确保每次至少有两个节点可交换。链表长度为 0 或 1 时直接返回原链表。释放内存 交换完成后删除虚拟头节点virtualHead避免内存泄漏。/** * 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* virtualHead new ListNode(0); virtualHead - next head; ListNode* cur virtualHead; while(cur - next ! nullptr cur - next - next ! nullptr){ ListNode* temp cur - next; ListNode* temp1 cur - next - next - next; cur - next cur - next - next; cur - next - next temp; temp - next temp1; cur cur - next - next; } ListNode* result virtualHead - next; delete virtualHead; return result; } };时间复杂度: O(n)空间复杂度: O(1)注此类题目建议画图模拟