LeetCode - 25. K 个一组翻转链表 -- java - 细节
Posted Dark And Grey
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode - 25. K 个一组翻转链表 -- java - 细节相关的知识,希望对你有一定的参考价值。
文章目录
- 题目
- 解题思维
- 来看我怎么做!第一步:创建一个 傀儡头节点
- 第二步: 再创建一个 傀儡头接节点 的替身tail - 你可以理解为尾巴节点(也就是我们的逆序节点中的尾巴节点)。
- 第三步: 为 逆序 k 个节点 做准备,逆序节点中的头节点前驱,我们有prev 记录着,但是 逆序节点中的尾巴节点 tail 的 next 值,我们还没处理,所以,我们需要创建 ListNode 变量 来记录 tail.next,方便逆序后,重新接入原链表中。
- 第四步:创建一个逆序 k 个节点 的 方法 myReverse,返回值为 ListNode[] 数组,将我们逆序后 “头节点”和“尾结点”返回,也方便我们将其接回原链表当中,因为我们记录 逆序节点 中 “头节点的前驱节点prev” 和 “尾巴节点的前驱节点tail”
- 第五步: 将返回来的 “头节点” 和 “尾结点”,重新置换刚开指向位置,方便我们后续接入原链表中。
- 第六步:将逆序后的节点 重新接入链表中
- 第七步: 为下一次,k个节点 逆序做准备
- 第八步: 将 逆序后的链表返回
- 程序写到这里,就写完了!
- 最后附上程序
题目
解题思维
既然 题目要求:每 k 个 节点,进行,一次旋转。那我就“截取” k 个节点,将其逆序后,拼接回原链表。
这就是我们的解题思维!
来看我怎么做!第一步:创建一个 傀儡头节点
目的一: 这个可以作为 交换 “头节点的前驱节点”
目的二:创建一个 傀儡节点的替身节点prev,方便下一次 做 替换k个节点的 “头节点的前驱节点”
目的三: 原先的头节点,就可以作为 逆序节点中的 “头节点”。
第二步: 再创建一个 傀儡头接节点 的替身tail - 你可以理解为尾巴节点(也就是我们的逆序节点中的尾巴节点)。
第三步: 为 逆序 k 个节点 做准备,逆序节点中的头节点前驱,我们有prev 记录着,但是 逆序节点中的尾巴节点 tail 的 next 值,我们还没处理,所以,我们需要创建 ListNode 变量 来记录 tail.next,方便逆序后,重新接入原链表中。
第四步:创建一个逆序 k 个节点 的 方法 myReverse,返回值为 ListNode[] 数组,将我们逆序后 “头节点”和“尾结点”返回,也方便我们将其接回原链表当中,因为我们记录 逆序节点 中 “头节点的前驱节点prev” 和 “尾巴节点的前驱节点tail”
第四步的执行过程
第五步: 将返回来的 “头节点” 和 “尾结点”,重新置换刚开指向位置,方便我们后续接入原链表中。
第五步:效果
第六步:将逆序后的节点 重新接入链表中
第七步: 为下一次,k个节点 逆序做准备
第八步: 将 逆序后的链表返回
程序写到这里,就写完了!
最后附上程序
/**
* Definition for singly-linked list.
* public class ListNode
* int val;
* ListNode next;
* ListNode()
* ListNode(int val) this.val = val;
* ListNode(int val, ListNode next) this.val = val; this.next = next;
*
*/
class Solution
public ListNode reverseKGroup(ListNode head, int k)
ListNode newHead = new ListNode();// 新建一个傀儡头节点
newHead.next = head;// 将原本的 头节点 head 接入 新头节点的next
ListNode prev = newHead;
while(head!=null)// 如果head为null,说明没有节点需要逆序了
ListNode tail = prev;
// 判断 傀儡节点后面的 节点个数 是否满足 逆序节点个数的要求
for(int i = 0;i < k;i++)
tail = tail.next;
if(tail == null)
return newHead.next;
ListNode tailNext = tail.next;
ListNode[] reverse = myReverse(head,tail);
head = reverse[0];
tail = reverse[1];
prev.next = head;
tail.next = tailNext;
prev = tail;
head = tail.next;
return newHead.next;
public static ListNode[] myReverse(ListNode head,ListNode tail)
ListNode pre = tail.next;
ListNode p = head;
while(pre != tail)
ListNode pNext = p.next;
p.next = pre;
pre = p;
p = pNext;
return new ListNode[]tail,head;
以上是关于LeetCode - 25. K 个一组翻转链表 -- java - 细节的主要内容,如果未能解决你的问题,请参考以下文章
算法leetcode|25. K 个一组翻转链表(rust重拳出击)