算法_链表_两两交换链表中的节点

jasmine 于 2019-06-02 发布
/**
 * 给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。
 * 你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。
 * 输入:head = [1,2,3,4]
 * 输出:[2,1,4,3]
 * 示例 2:
 * 输入:head = []
 * 输出:[]
 * 示例 3:
 * 输入:head = [1]
 * 输出:[1]
 * 提示:
 * 链表中节点的数目在范围 [0, 100] 内
 * 0 <= Node.val <= 100
 *
 */
public class 两两交换链表中的节点 {

    /**
     * 双指针解法
     * 注意点:节点交换位置的时候,注意顺序
     */
    public static Node.IntNode swapPairs(Node.IntNode head) {

        Node.IntNode dummyNode = new Node.IntNode(-1, head);

        //posNode前一个节点为prePosNode
        Node.IntNode prePosNode = dummyNode;
        //需要交换位置的两个节点,第一个为posNode
        Node.IntNode posNode = prePosNode.next;

        while (posNode != null && posNode.next != null) {

            //需要交换位置的第二个节点
            Node.IntNode posNodeNext = posNode.next;
            //下一个需要交换位置的posNode节点
            Node.IntNode posNodeNextNext = posNodeNext.next;

            //两点交换的时候要注意交换顺序
            prePosNode.next = posNodeNext;
            posNode.next = posNodeNextNext;
            posNodeNext.next = posNode;

            //移动指针
            prePosNode = posNode;
            posNode = posNode.next;
        }

        return dummyNode.next;
    }

    public static void main(String[] args) {

        Node.IntNode intNode = swapPairs(Node.getIncrNode(9));
        Node.IntNode.printNodes(intNode);

    }
}