LeetCode Java刷题笔记—24. 两两交换链表中的节点
给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。
中等难度。这道题实际上就是的特殊情况,因此我们直接带入即可求解:
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; }
上一篇:
IDEA上Java项目控制台中文乱码