1 题目地址
24. 两两交换链表中的节点 - 力扣(LeetCode)24. 两两交换链表中的节点 - 给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。 示例 1:[https://assets.leetcode.com/uploads/2020/10/03/swap_ex1.jpg]输入:head = [1,2,3,4]输出:[2,1,4,3]示例 2:输入:head = []输出:[]示例 3:输入:head = [1]输出:[1] 提示: * 链表中节点的数目在范围 [0, 100] 内 * 0 <= Node.val <= 100https://leetcode.cn/problems/swap-nodes-in-pairs/description/
2 题目说明
给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。
示例 1:
输入:head = [1,2,3,4] 输出:[2,1,4,3]
示例 2:
输入:head = [] 输出:[]
示例 3:
输入:head = [1] 输出:[1]
提示:
- 链表中节点的数目在范围
[0, 100]
内 0 <= Node.val <= 100
3 解题思路
使用虚拟头结点,简化操作,否则处理头节点(没有节点指向头结点)的时候还需要特殊处理。
1 curr指向待交换节点的前一个节点(首次虚拟头结点)
2 需要判断下一个节点,下下个节点不能为空,否则无须交换(容易发生空指针)
3 移动指针,curr指向第二个节点【13】;
第二个节点【13】指向第一个节点【12】;
第一个节点【12】指向第三个节点【14】;
移动curr,准备下一轮处理, curr指向第一个节点【12】
4 代码编写
4.1 非递归
/*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode() {}* ListNode(int val) { this.val = val; }* ListNode(int val, ListNode next) { this.val = val; this.next = next; }* }*/
class Solution {public ListNode swapPairs(ListNode head) {// 定义虚拟头节点ListNode temp = new ListNode(-1, head);// 第一次: 当前节点指向头结点ListNode curr = temp;// 当前节点的下一个节点,以及下下个节点不为空时,才需要交换while (curr.next != null && curr.next.next != null) {ListNode first = curr.next;ListNode second = curr.next.next;ListNode third = curr.next.next.next;curr.next = second; // 步骤一second.next = first; // 步骤二first.next = third; // 步骤三curr = first; // 移动两位,准备下一轮}return temp.next;}
}
4.2 递归
后期待补充