1. 题目
题目链接:24. 两两交换链表中的节点
2. 思路
使用三指针每次交换两个节点,然后将三个节点依次向前移动两次,注意边界条件即可。
3. 代码
/**
* 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) {
if (head == null || head.next == null) return head;
ListNode dummyNode = new ListNode(0);
dummyNode.next = head;
// 被交换两个节点的第二个节点
ListNode prev = dummyNode;
// 被交换两个节点的第二个节点
ListNode fast = head.next;
// 被交换两个节点的前面一个没有交换的节点
ListNode slow = head;
while (fast != null) {
// 交换节点的位置,把prev指向交换后的节点上
slow.next = fast.next;
fast.next = slow;
prev.next = fast;
// 将三个指针交换位置,保持和初始化一样的状态
prev = slow;
slow = fast;
fast = prev;
// 边界判断一下,如果fast后面没有节点就直接返回 防止fast.next.next;空指针异常
if (fast.next == null) break;
// 后面有超过1个节点,将slow和fast向前移动两次,prev刚好和初始化一致
fast = fast.next.next;
slow = slow.next.next;
}
return dummyNode.next;
}
}