拨开荷叶行,寻梦已然成。仙女莲花里,翩翩白鹭情。
IMG-LOGO
主页 文章列表 LeetCode - 25. K 个一组翻转链表 -- java - 细节

LeetCode - 25. K 个一组翻转链表 -- java - 细节

白鹭 - 2022-01-24 2105 0 0

文章目录

  • 题目
  • 解题思维
    • 来看我怎么做!第一步:创建一个 傀儡头节点
    • 第二步: 再创建一个 傀儡头接节点 的替身tail - 你可以理解为尾巴节点(也就是我们的逆序节点中的尾巴节点),
    • 第三步: 为 逆序 k 个节点 做准备,逆序节点中的头节点前驱,我们有prev 记录着,但是 逆序节点中的尾巴节点 tail 的 next 值,我们还没处理,所以,我们需要创建 ListNode 变量 来记录 tail.next,方便逆序后,重新接入原链表中,
    • 第四步:创建一个逆序 k 个节点 的 方法 myReverse,回传值为 ListNode[] 阵列,将我们逆序后 “头节点”和“尾结点”回传,也方便我们将其接回原链表当中,因为我们记录 逆序节点 中 “头节点的前驱节点prev” 和 “尾巴节点的前驱节点tail”
      • 第四步的执行程序
    • 第五步: 将回传来的 “头节点” 和 “尾结点”,重新置换刚开指向位置,方便我们后续接入原链表中,
      • 第五步:效果
    • 第六步:将逆序后的节点 重新接入链表中
    • 第七步: 为下一次,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};
    }
}
标签:

0 评论

发表评论

您的电子邮件地址不会被公开。 必填的字段已做标记 *