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

Posted 刘Java

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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;

以上是关于LeetCode Java刷题笔记—24. 两两交换链表中的节点的主要内容,如果未能解决你的问题,请参考以下文章

LeetCode刷题笔记-数据结构-day12

java刷题--24两两交换链表中的节点

LeetCode Java刷题笔记—83. 删除排序链表中的重复元素

LeetCode - 24 - 两两交换链表中等的节点 - Java

LeetCode 24. 两两交换链表中的节点 c++/java详细题解

Leetcode24. 两两交换链表中的节点(JAVA迭代+递归)