/**
* 给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。
* 你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。
* 输入: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);
}
}