把链表上相邻的节点两两调换位置,这道题可以用递归和迭代两种办法解决。题目给的链表结构里有 Head、Head.next、ListNode、Node、Node.val,还有 Pairs 和 Solution。数据范围规定链表长度不超过 100,每个节点的值在 1 到 1000 之间。 先说说递归的做法。递归的思路是每次只交换前两个节点,剩下的部分继续递归处理。如果链表为空或者只剩一个节点,就停止递归。具体的递归过程有三个步骤:先把后面的部分递归交换得到新的头结点 newHead;把原链表的头结点 next 指针指向 newHead;再让 newHead 的 next 指向原头结点,这样就完成了这一对的交换。 代码实现起来也很直接:如果头结点为空或者下一个节点为空,直接返回原头结点作为结果。否则,把新的头结点设为原来的第二个节点,接着让原头结点的 next 指向递归处理后的新头结点之后的部分,最后让新头结点的 next 指向原头结点。时间复杂度是 O(n),因为每个节点只遍历一次;空间复杂度也是 O(n),因为递归栈最深可以到 n 层。 再看看迭代的解法。迭代需要借助哑节点来简化边界条件。每次循环处理相邻的两个节点,把它们的指向反过来。循环的条件是 temp.next 和 temp.next.next 都不为空,这样就能保证后面至少还有两个节点。具体操作分四步:先把哑节点指向第二个要交换的节点;把第一个要交换的节点 next 指向第二个节点之后的部分;再让第二个节点的 next 指向第一个节点;最后把哑节点移动到下一对要交换的位置。 代码实现的时候,先创建一个哑节点指向原头结点。用 temp 指针指向哑节点的位置开始处理。进入循环后,取出要交换的两个节点 node1 和 node2。第一步把哑节点指向 node2;第二步把 node1 的 next 指向 node2 的 next;第三步把 node2 的 next 指向 node1;第四步把 temp 移动到 node1 的位置。最后返回哑节点之后的真实头结点即可。时间复杂度同样是 O(n),空间复杂度只有 O(1),因为只用了常量级别的额外空间。