25. K 个一组翻转链表[困难]

102 阅读1分钟

问题

给你一个链表,每 k 个节点一组进行翻转,请你返回翻转后的链表。

k 是一个正整数,它的值小于或等于链表的长度。

如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序。

进阶:

  • 你可以设计一个只使用常数额外空间的算法来解决此问题吗?
  • 你不能只是单纯的改变节点内部的值,而是需要实际进行节点交换。

image.png

思路

乍一看挺难的,细思其实是一个 栈 的应用。


class Solution {
    public ListNode reverseKGroup(ListNode head, int k) {
        ListNode p = head;
        Stack<ListNode> stack = new Stack<>();
        ListNode nHead = null, np = null;

        while (p != null) {
            int i = 0;
            // 在不足k个时,需要记录一下
            ListNode temp = p;
            for (; i < k && p != null; i++) {
                stack.push(p);
                p = p.next;
            }
            if (i == k) {
                while (!stack.isEmpty()) {
                    ListNode q = stack.pop();
                    if (nHead == null) {
                        nHead = q;
                        np = nHead;
                    } else {
                        np.next = q;
                        np = q;
                    }
                }
            } else {
                p = temp;
                break;
            }
        }
        if (nHead == null) {
            nHead = head;
        } else {
            np.next = p;
        }
        return nHead;
    }
}

时间复杂度:O(n)

空间复杂度:O(k)

硬广告

欢迎关注公众号:double6