2025年- H28-Lc136- 24.两两交换链表中的节点(链表)---java版
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和节点2ListNode curr=dummyhead;//3.while可以进行无限循环,终止条件就说偶数节点curr.next!=null才能交换,融合curr.next==null,说明已经到达最后一个节点//此处要&&,保证不会有空指针异常while(curr.next!=null&&curr.next.next!=null){//4.在第五步赋值之前,创建两个临时变量保留节点1和节点3ListNode temp1=curr.next;ListNode temp3=curr.next.next.next;//5.虚拟头节点指向节点2(现在==过去)curr.next=curr.next.next;//6.节点2的指针指向节点1curr.next.next=temp1;//7.节点1(此时节点1是temp1)的指针指向节点3temp1.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;}}
}