package com.example.demo.leecode;
/**
 * 两两交换链表中的节点
 * @Date 2020/12/16
 * @author Tang
 *
 * 给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。
 * 你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。
 */
public class SwapNodesInPairs {
    public ListNode execute(ListNode head){
        //创建一个首节点 value为null
        ListNode first = new ListNode();
        first.next = head;
        doSwap(first);
        return first.next;
    }
    private void doSwap(ListNode left){
        ListNode right = left.next;
        if(right == null || right.next == null){
            return;
        }
        left.next = right.next;
        right.next = left.next.next;
        left.next.next = right;
        doSwap(right);
    }
    public static void main(String[] args) {
        ListNode l1 = new ListNode(1);
        ListNode l2 = new ListNode(2);
        ListNode l3 = new ListNode(3);
        ListNode l4 = new ListNode(4);
        ListNode l7 = new ListNode(5);
        ListNode l8 = new ListNode(6);
        l1.next = l2; l2.next = l3; l3.next = l4;
        l4.next = l7; l7.next = l8;
        ListNode execute = new SwapNodesInPairs().execute(l1);
        System.out.println(execute.val);
        while(execute.hasNext()){
            execute = execute.next;
            System.out.println(execute.val);
        }
    }
}
class ListNode {
    int val;
    ListNode next;
    ListNode() {}
    ListNode(int val) {
        this.val = val;
    }
    ListNode(int val, ListNode next) {
        this.val = val;
        this.next = next;
    }
    boolean hasNext(){
        return next != null;
    }
}