leetcode题解-24. Swap Nodes in Pairs

来源:互联网 发布:老徐外设店淘宝 编辑:程序博客网 时间:2024/04/27 15:35

题意:给定一个链表,交换相邻的两个结点,返回交换之后的头结点。

例子:给定链表 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;    }}