美文网首页
25.K 个一组翻转链表

25.K 个一组翻转链表

作者: justonemoretry | 来源:发表于2020-06-18 23:43 被阅读0次

自己解法

这个题是最近做过最难的一道链表题,链表题最关键的就是前置节点、后置节点的维护,这题真的被绕晕了,自己憋了一个晚上写了个巨长的逻辑,太乱了,先贴自己解法,思路是,K个一组进行切割,每组进行链表的反转操作。

class Solution {

    public ListNode reverseKGroup(ListNode head, int k) {

        if (head == null || k == 1) {

            return head;

        }

        ListNode dummy = new ListNode(-1);

        ListNode preNode = dummy;

        preNode.next = head;

        int i = 1;

        while (head != null && head.next != null) {

            head = head.next;

            i++;

            if (i == k) {

                ListNode temp = head.next;

                head.next = null;

                List<ListNode> listNodes = reverseListNode(preNode.next);

                preNode.next = listNodes.get(0);

                preNode = listNodes.get(1);

                head = temp;

                preNode.next = head;

                i = 1;

            }

        }

        return dummy.next;

    }

    public List<ListNode> reverseListNode(ListNode head) {

        ListNode tail = head;

        ListNode preNode = null;

        while (head != null) {

            ListNode temp = head.next;

            head.next = preNode;

            preNode = head; 

            head = temp;

        }

        List<ListNode> res = new ArrayList<ListNode>(4);

        res.add(preNode);

        res.add(tail);

        return res;

    }

}

官方解法

下面贴上纯手打官方解法,就是维护要翻转的K个节点的前置节点pre,结尾节点end,有了这两个节点,可以很容易获取K个节点的开始节点start和K个节点的后置节点next。这样将反转后的节点拼到整个链表中就可以了,反转的时候有个小技巧,不要用head做后移,新起个变量,这样的话,这个head最后就是反转后链表的尾部,可以用来连接第3段链表。

class Solution {

    public ListNode reverseKGroup(ListNode head, int k) {

        if (head == null || k == 1) {

            return head;

        }

        ListNode dummy = new ListNode(-1);

        dummy.next = head;

        ListNode pre = dummy;

        ListNode end = dummy;

        while (end != null) {

            for (int i = 0; i < k && end != null; i++) {

                end = end.next;

            }

            if (end == null) {

                break;

            }

            ListNode start = pre.next;

            ListNode next = end.next;

            end.next = null;

            pre.next = reverseListNode(start);

            // start不进行移动就是链表的结尾

            start.next = next;

            pre = start;

            end = start;

        }

        return dummy.next;

    }

    public ListNode reverseListNode(ListNode head) {

        ListNode pre = null;

        // 不移动head指针,head指针会在反转后的最后一位

        ListNode cur = head;

        while (cur != null) {

            ListNode next = cur.next;

            cur.next = pre;

            pre = cur;

            cur = next;

        }

        return pre;

    }

}

相关文章

  • 【LeetCode】25.K个一组翻转链表

    题目描述 25.K个一组翻转链表 给你一个链表,每 k 个节点一组进行翻转,请你返回翻转后的链表。 k是一个正整数...

  • 25. k个一组翻转链表

    25.k个一组翻转链表 给出一个链表,每k个节点一组进行翻转,并返回翻转后的链表。 k是一个正整数,它的值小于或等...

  • 链表

    一、目录 206.反转链表 24.两两交换链表中的节点 25.K 个一组翻转链表(hard) 234.回文链表 1...

  • 如何k个一组反转链表

    读完本文,你可以去力扣拿下如下题目: 25.K个一组翻转链表[https://leetcode-cn.com/pr...

  • 25.K 个一组翻转链表

    自己解法 这个题是最近做过最难的一道链表题,链表题最关键的就是前置节点、后置节点的维护,这题真的被绕晕了,自己憋了...

  • 25. K 个一组翻转链表

    K个一组反转链表 翻转链表给你一个链表,每 k 个节点一组进行翻转,请你返回翻转后的链表。 k 是一个正整数,它...

  • K 个一组翻转链表(递归,Kotlin)

    25. K 个一组翻转链表 给你一个链表,每 k 个节点一组进行翻转,请你返回翻转后的链表。 k 是一个正整数,它...

  • 【Leetcode】【链表】025-Reverse Nodes

    k个一组翻转链表 给出一个链表,每 k 个节点一组进行翻转,并返回翻转后的链表。k 是一个正整数,它的值小于或等于...

  • 前端常见算法题(链表篇)

    一、反转问题 2021.02.11 No.25 K个一组翻转链表 给你一个链表,每 k 个节点一组进行翻转,请你返...

  • LeetCode练习day4-链表相关

    LeetCode25 K个一组翻转链表 题目详情 给你链表的头节点 head ,每 k 个节点一组进行翻转,请你返...

网友评论

      本文标题:25.K 个一组翻转链表

      本文链接:https://www.haomeiwen.com/subject/lbuexktx.html