难度:中等
给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。
示例 1:
输入:head = [1,2,3,4]
输出:[2,1,4,3]
示例 2:
输入:head = []
输出:[]
示例 3:
输入:head = [1]
输出:[1]
双指针
重要步骤:应先改变左节点的箭头指向,后改变右节点的箭头指向 。
二者顺序不可改变,若先改变右节点箭头指向,让它指向左节点,此时左节点和右节点会形成环,就无法再让左节点指向右节点的下一个节点了。
var swapPairs = function(head) {
if(!head||!head.next) return head
var point = new ListNode(0,head) //设一个前置节点,此节点值为0,指向head
var pre = point
while(pre.next && pre.next.next){ //保证前置节点的后两个节点都存在
var left = pre.next
var right = pre.next.next
left.next = right.next //让左节点指向右节点的下一个节点
right.next = left //让右节点指向左节点
pre.next = right //让前置节点指向右节点,此时完成相邻节点的交换
pre = pre.next.next //前置节点向后移动两个位置,以便交换下一个组相邻节点
}
return point.next
};