题目:
给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。
思考:
1. 两两交换,首先想到了各种断开重组的情况,想到了用双指针的方式做;
2. 断开后重组的过程可以分为两步
1)断开形成两个新的子链表,链表结构为所有双数index的链表,和所有单数index的链表
2)将这两个新的子链表合并,从单数开始合并,单数放到偶数前,直到遍历结束
2)双数index的链表个数>=单数index链表的个数,可在遍历时将其作为结束条件
3. 注意边界情况
!!MARK一下第一次执行用时:0 ms, 在所有 Java 提交中击败了100.00%的用户
代码:
public static ListNode swapPairs(ListNode head) {
if (head == null || head.next == null) {
return head;
}
ListNode a = head;
ListNode b = head.next;
ListNode m = head;
ListNode n = head.next;
while (a != null && b!= null) {
a.next = b.next;
a = a.next;
if (a == null) {
b.next = null;
break;
}
b.next = a.next;
b = b.next;
}
ListNode result = n;
while (m != null && n!= null) {
ListNode k = m.next;
ListNode x = n.next;
if (n.next == null) {
n.next = m;
break;
}
m.next = n.next;
n.next = m;
m = k;
n = x;
}
return result;
}