1.题目描述
2.思路
cur指针要先放在虚拟头节点,才能去操作第一个数和第二个数
先判断偶数个节点,再判断奇数个节点,否则会犯空指针异常。
(1)如果节点是偶数个节点,只要满足curr.nextnull,就说明遍历结束了
(2)如果节点是奇数个节点,只要满足curr.next.nextnull,说明遍历就结束了
(3)如果是0个节点。curr指向的是虚拟头节点,所以也满足curr.next=null
(4)在赋值操作之前,定义一个临时变量,保存节点1(curr.next)
(5)在赋值操作之前,也需要定义一个临时变量,保存节点3(curr.next.next.next)
(6)要交换节点3和节点4的时候,要把curr从节点1移动到节点3,所以就要执行curr=curr.next.next。
(7)最后返回链表的头节点
3.代码实现
class ListNode{
int val;
ListNode next;
public ListNode() {
}
public ListNode(int val) {
this.val = val;
}
public ListNode(int val,ListNode next) {
this.val = val;
this.next = next;
}
}
public class H24 {
public ListNode swapPairs(ListNode head) {
//1.创建一个虚拟头节点
ListNode dummyhead=new ListNode(0);
dummyhead.next=head;
//2.定义一个curr指针,curr==dummyhead,才能操作节点1和节点2
ListNode curr=dummyhead;
//3.while可以进行无限循环,终止条件就说偶数节点curr.next!=null才能交换,融合curr.next==null,说明已经到达最后一个节点
//此处要&&,保证不会有空指针异常
while(curr.next!=null&&curr.next.next!=null)
{
//4.在第五步赋值之前,创建两个临时变量保留节点1和节点3
ListNode temp1=curr.next;
ListNode temp3=curr.next.next.next;
//5.虚拟头节点指向节点2(现在==过去)
curr.next=curr.next.next;
//6.节点2的指针指向节点1
curr.next.next=temp1;
//7.节点1(此时节点1是temp1)的指针指向节点3
temp1.next =temp3;
//8.将cur指针移动到交换后1的位置,因为此时要交换3和和4了(2-》1-》3-》4)
curr=curr.next.next;
}
return dummyhead.next;//返回头节点
}
public static void main(String[] args)
{
H24 test=new H24();
//创建1,2,3,4节点
ListNode node4=new ListNode(4,null);
ListNode node3=new ListNode(3,node4);
ListNode node2=new ListNode(2,node3);
ListNode head=new ListNode(1,node2);
ListNode result = test.swapPairs(head);
System.out.println("输出两两交换链表的结果:");
while(result!=null)
{
System.out.print(+result.val);
if (result.next!=null)
{
System.out.print("->");
}
result=result.next;
}
}
}