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

139 阅读1分钟

题目

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

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

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

进阶:

  • 你可以设计一个只使用常数额外空间的算法来解决此问题吗?
  • 你不能只是单纯的改变节点内部的值,而是需要实际进行节点交换。
  • 来源:力扣(LeetCode)
  • 链接:leetcode-cn.com/problems/re…
  • 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

思路

  • 考虑使用栈实现
  • 处理最后不足k个的情况

代码

    public ListNode reverseKGroup(ListNode head, int k) {
        ListNode dummyHead = new ListNode();
        ListNode p = head;
        ListNode np = dummyHead;
        ListNode flag = p;
        while (p != null) {
            flag = p;
            Stack<ListNode> stack = new Stack<ListNode>();
            for (int i = 0; i < k && p != null; i++) {
                stack.push(p);
                p = p.next;
            }

            if (stack.size() == k) {
                while (!stack.isEmpty()) {
                    ListNode temp = stack.pop();
                    np.next = temp;
                    np = temp;
                }
                flag = null;
            }
        }
        np.next = flag;
        return dummyHead.next;
    }