给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。
这道题的重点在于对(前驱节点)哨兵节点的使用
1、首先让哨兵节点l1=heads 头哨兵节点
2、l2等于l1的指向 ,即节点1;现在l2就是节点1;
由于已经用l2记录下了l1的指向,所以开始对l1的指向操作,将l1的next指向节点2,
l1.next = l2.next;
此时相当于节点1的指向已被记录,所以对节点1的指向使用l2操作,
l2.next = l2.next.next;
此时节点1有了新的后继节点3 ,节点2有了新的前驱节点头哨兵节点,现在将节点2反向指向节点1,即
l1.next.next = l2;
即
然后将l1作为前驱节点后移l1.next=l1.next.next 或者 l1=l2;
进行下一轮操作
完整代码为:
public ListNode swapPairs(ListNode head) {
if(head==null) return null;
ListNode heads = new ListNode(0);
//创建头哨兵节点
heads.next = head;
//与链表链接
ListNode l1 = heads;
//反转过程所需要的哨兵节点
ListNode l2 = null;
//过度链接使用的节点
while (l1.next!=null&&l1.next.next!=null){
l2 = l1.next;
l1.next = l2.next;
l2.next = l2.next.next;
l1.next.next = l2;
l1 = l1.next.next;
}
return heads.next;
}
如有错误,请大神批评指教!!