package leetcode.wyj;

import leetcode.model.ListNode;

/**
 * 给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。
 * <p>
 * 你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。
 * <p>
 *  
 * <p>
 * 示例:
 * <p>
 * 给定 1->2->3->4, 你应该返回 2->1->4->3.
 * <p>
 * 来源:力扣(LeetCode)
 * 链接:https://leetcode-cn.com/problems/swap-nodes-in-pairs
 * 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
 */
public class LeetCode24 {

    public static ListNode swapPairs(ListNode head) {
        if (head == null || head.next == null) {
            return head;
        }
        ListNode firstPoint = new ListNode();
        firstPoint.next = head;

        ListNode point1 = firstPoint;
        ListNode point2 = firstPoint.next;
        ListNode point3 = firstPoint.next.next;

        while (point3 != null) {
            point1.next = point2.next;
            point2.next = point3.next;
            point3.next = point2;

            point1 = point1.next.next;

            point2 = point1.next;
            if (point2 == null) {
                break;
            }
            point3 = point2.next;
            if (point3 == null) {
                break;
            }
        }
        return firstPoint.next;

    }
}