本文已参加 新人礼创作礼 活动,一起开启掘金创作之旅
LeetCode24. 两两交换链表中的节点(2022/10/21)
题目描述
给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。
样例
输入: head = [1,2,3,4]
输出: [2,1,4,3]
示例2:
输入: head = []
输出: []
示例3:
输入: head = [1]
输出: [1]
提示:
- 链表中节点的数目在范围
[0, 100]
内 0 <= Node.val <= 100
算法1
(模拟)
- 通过题意可知,链表的头结点会发生改变,故为了考虑特殊情况,定义一个虚拟头结点
dummy
,使其dummy.next = head
。 - 由于需要两两交换结点,我们需要找到三个结点的位置:需要交换的结点以及交换前一个结点(第一个结点的前一个结点就是
dummy
),从最开始的三个结点依次为:dummy(p), dummy.next(a), dummy.next.next(b)
,故在循环时需要判断dummy.next
和dummy.next.next
不为空,交换为了防止结点丢失,需要按照如下步骤进行:对应伪代码为:
p.next = b;
a.next = b.next;
b.next = a;
p = a;
- 最后返回
dummy.next
即可 - ps:这里并不需要判断链表是否为空,直接按照正常处理即可。
Java 代码
/**
* 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 dummy = new ListNode(-1);
dummy.next = head;
ListNode p = dummy;
while(p.next != null && p.next.next != null) {
ListNode a = p.next;
ListNode b = p.next.next;
p.next = b;
a.next = b.next;
b.next = a;
p = a;
}
return dummy.next;
}
}