题目:
给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。
题目链接:力扣
我的解法直接使用指针交换,并没有涉及到递归,感兴趣可以看看
首先排除特殊情况:head == null || head.next == null
再在head前加一个 h 节点作为链表的新头,val无所谓;这样就形成了 h -> p -> q (0 -> 1 -> 2 ...);
p、q 是需要交换的节点, 交换语句 h.next = q; p.next = q.next; q.next = p; 换完后h -> p -> q 变为
h -> q -> p; 所以 重新赋值时要注意元素顺序,自己可以画图试试就懂了,h节点是不参与交换的。
循环中的h p q 节点 0 1 2 // 2 3 4,结束;返回时把 0 去掉,return he.next;
public ListNode swapPairs(ListNode head) {
if(head == null || head.next == null){
return head;
}
ListNode he = new ListNode(0,head);
ListNode h = he;
ListNode p = h.next;
ListNode q = p.next;
while(q != null){
//交换 p q
h.next = q;
p.next = q.next;
q.next = p;
//重新赋值h p q
h = p;
//避免越界错误
if(h.next == null){
break;
}
p = p.next;
q = p.next;
}
return he.next;
}