LeetCode Java刷题笔记—24. 两两交换链表中的节点

24. 两两交换链表中的节点

给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。

中等难度。这道题实际上就是LeetCode Java刷题笔记—25. K 个一组翻转链表的特殊情况,因此我们直接带入即可求解:

public ListNode swapPairs( ListNode head ){
   //因为头节点是可变的,因此初始化哨兵节点来保存头节点
   ListNode dummy = new ListNode( 0, head );
   //统计链表节点的数量
   int count = 0;
   while( head != null ){
      head = head.next;
      count++;
   }
   //初始化pre节点,指向要反转的链表首节点的前驱节点
   ListNode pre = dummy;
   //head首先指向要反转的链表首节点
   head = pre.next;
   //外层循环表示d需要进行轮次的反转
   for( int i = 0; i < count / 2; i++ ){
      //内层循环对当前轮次范围内的部分链表节点进行反转,这一部分的思路同 Leetcode 92. 反转链表 II
      //注意,2个组的节点,需要翻转2-1次,因此这里的j从1开始
      for( int j = 1; j < 2; j++ ){
         //获取当前需要反转的节点的后继
         ListNode next = head.next;
         //当前节点的后继指向后继节点的后继
         head.next = next.next;
         //后继节点的后继指向前驱节点的后继
         next.next = pre.next;
         //前驱节点的后继指向当前节点的后继,完成反转
         pre.next = next;
      }
      //每一轮的反转结束,我们需要调整pre和head的位置,pre节点永远指向要反转的节点的前驱节点,head首先指向要反转的链表首节点
      //上一轮反转完毕之后,head指向当前部分子链表的最后一个节点,也就是下一轮要反转的子链表头节点的前驱节点
      //因此让pre指向head,head指向head的后继
      pre = head;
      head = head.next;
   }
   return dummy.next;
}

当然,这道题是一个特例问题,那么必然有特别的、更简单的解题方法。由于只是需要交换相邻的节点,因此我们没必要那么麻烦的去计算要交换的轮次等数据,只要相邻的两个节点都不为null,即可进行交换。

public ListNode swapPairs( ListNode head ){
   //烧饼节点
   ListNode dummy = new ListNode( 0, head ), pre = dummy;
   //如果相邻节点都不为null
   while( head != null && head.next != null ){
      //这部分的代码用于交换相邻节点
      ListNode next = head.next;
      head.next = next.next;
      next.next = pre.next;
      pre.next = next;
      //向后移动指针
      pre = head;
      head = head.next;
   }
   return dummy.next;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

刘Java

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值