题意:给定一个链表,交换相邻的两个结点,返回交换之后的头结点。
例子:给定链表 1->2->3->4, 返回链表 2->1->4->3.
分析:关键在于分析循环的结束条件。以例子来说明:
设置三个指针pre,leftNode,secondNode。初始值如下,
pre = dummyNode;
leftNode= 节点1;
secondNode = 节点2;
循环条件为while(right.next != null && right.next.next != null),即判断节点3和节点4是否为空节点,如果有一个为空节点,那么节点1和节点2也不swap;如果节点3和节点4都不为空节点,那么节点1和节点2进行swap。然后将firstNode和secondNode后移到节点2和节点4。
在本例中,节点4的next为空,所以节点3和节点4不为空,所以在循环外做收尾处理,即将节点3和节点4进行swap。
那么,代码为:
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public ListNode swapPairs(ListNode head) {
if(head == null || head.next == null) return head;
ListNode fakeHead = new ListNode(0);
fakeHead.next = head;
ListNode pre = fakeHead;
ListNode left = head;
ListNode right = head.next;
while(right.next != null && right.next.next != null){
left.next = right.next;
right.next = left;
pre.next = right;
left = left.next;
right = right.next.next.next;
pre = pre.next.next;
}
left.next = right.next;
right.next = left;
pre.next = right;
return fakeHead.next;
}
}