LeetCode Java刷题笔记—24. 两两交换链表中的节点
Posted 刘Java
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode Java刷题笔记—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 Java刷题笔记—83. 删除排序链表中的重复元素
LeetCode - 24 - 两两交换链表中等的节点 - Java