题目:
给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。
示例 1:
输入:head = [1,2,3,4]
输出:[2,1,4,3]
示例 2:
输入:head = []
输出:[]
示例 3:
输入:head = [1]
输出:[1]
提示:
链表中节点的数目在范围 [0, 100] 内
0 <= Node.val <= 100
解题思路:创建一个虚拟头节点dummy,然后让它的next指向原链表的头节点。使用一个指针current来追踪要交换的一对节点的前一个节点,当至少还有两个节点可以交换时,进行交换操作。在每一次交换操作中,先将firstNode的next指向secondNode的next,然后将secondNode的next指向firstNode,最后将current的next指向secondNode,完成一次交换。最后返回虚拟头节点dummy的下一个节点,即为交换后的链表头节点。
class Solution {
public ListNode swapPairs(ListNode head) {
// 如果链表为空或者链表只有一个节点,直接返回原链表头节点
if (head == null || head.next == null) {
return head;
}
// 创建一个新的虚拟头节点,使得操作更方便
ListNode dummy = new ListNode(0);
dummy.next = head;
ListNode current = dummy; // current指向要交换的两个节点的前一个节点
// 当至少还有两个节点可以交换时
while (current.next != null && current.next.next != null) {
ListNode firstNode = current.next; // firstNode指向要交换的一对节点中的第一个节点
ListNode secondNode = current.next.next; // secondNode指向要交换的一对节点中的第二个节点
// 交换操作
firstNode.next = secondNode.next;
secondNode.next = firstNode;
current.next = secondNode;
// 将current指向交换后的第二个节点,为下一次交换做准备
current = firstNode;
}
// 返回虚拟头节点的下一个节点,即交换后的链表头节点
return dummy.next;
}
}