两两交换链表中的节点,题中要求不可以只进行值的交换,要真正的改变链表中的节点
tips 节点两两交换操作与206.反转链表相同
就是先反转两个节点,再与之后被反转的两个节点连接在一起
- 如果是奇数个节点,那么就把最后一个节点连接上
代码剖析
展示自定义节点的具体作用
ListNode curr=null;
ListNode prev=head;
ListNode temp=null;
ListNode linkNode=null;
ListNode result=head;
节点两两交换操作
循环两次,自然就完成了两两交换
for (int i = 0; i < 2; i++) {
temp=prev.next;
prev.next=curr;
curr=prev;
prev=temp;
}
确定result节点操作
if (i==1)
条件表明链表已经局部两两交换完毕
若linkNode为空说明是第一次连接操作,此时prev节点的位置正好在
2号小球处,就是需要返回的头节点了,让result节点的地址为prev,完成操作
连接linkNode操作
若linkNode不为空,则说明已经进行了i>=1次while循环,则此时情况如下:
直接让
linkNode.next=prev;
即1号小球与4号小球连接
若为奇数个节点,则让linkNode与最末尾节点连接
if (temp!=null) linkNode.next=temp;
此时temp位置为第5号小球
传入空链表处理
ListNode result=head;
如果传入链表为空,则不会进入while循环且由于
ListNode temp=null;
初始化为null
则if (temp!=null) linkNode.next=temp;
不会执行
直接返回result=head
源代码
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode() {}
* ListNode(int val) { this.val = val; }
* ListNode(int val, ListNode next) { this.val = val; this.next = next; }
* }
*/
class Solution {
public ListNode swapPairs(ListNode head) {
ListNode curr=null;
ListNode prev=head;
ListNode temp=null;
ListNode linkNode=null;
ListNode result=head;
while (prev!=null&&prev.next!=null){
// 每一次循环中curr都要置空
curr=null;
for (int i = 0; i < 2; i++) {
temp=prev.next;
prev.next=curr;
if (i==1){
if (linkNode!=null) linkNode.next=prev;
else result=prev;
}
curr=prev;
prev=temp;
// 经过两个轮次的调换之后,cur已经成为了前一段的第一个节点,prev已经成了后一段的未调换之前的第一个节点
}
linkNode=curr.next;//linkNode已经成为前一段的最后一个节点,准备链接了
}
if (temp!=null) linkNode.next=temp;
return result;
//就是先把偶数个的节点都换掉,然后再把奇数个的最后节点添加上呗
}
}