K 个一组翻转链表(Reverse Nodes in k-Group)java_leetcode25

K 个一组翻转链表(Reverse Nodes in k-Group)java_leetcode25

版权©: https://blog.csdn.net/zhangjingao/article/details/96966465

题干

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

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

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

示例 :

给定这个链表:1->2->3->4->5

当 k = 2 时,应当返回: 2->1->4->3->5

当 k = 3 时,应当返回: 3->2->1->4->5

说明 :

你的算法只能使用常数的额外空间。
你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/reverse-nodes-in-k-group
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

题解

  这道题就是想到了关键就简单,想不到就很难。
  这道题我使用栈来做,我看了第一名使用的数组去做的,我还没看,之后我自己在研究,说一下我自己的做法。
  k个一组,那么就new一个stack,然后k个一循环压入栈中,再弹出加入新链表。如果剩余的链表长度不足k那么直接不用管栈中的,将链表之后加入新链表。

代码

   public ListNode reverseKGroup(ListNode head, int k) {
        if (head == null) {
            return head;
        }
        ListNode cur = head;
        ListNode newListNode = new ListNode(0);
        ListNode result = newListNode;
        //用来在压入栈前存放链表,当链表长度不够时追加次链表
        ListNode tmp = null;
        int index = 0;
        Stack stack = new Stack<>();
        while (cur != null) {
            tmp = cur;
            //k个一组压入栈
            while (cur != null) {
                stack.push(cur.val);
                cur = cur.next;
                if (++index % k == 0) {
                    break;
                }
            }
            //如果有剩余链表,但是不是k的倍数
            if (cur == null && index % k != 0) {
                break;
            }
            while (!stack.empty()) {
                newListNode.next = new ListNode(stack.pop());
                newListNode = newListNode.next;
            }
            tmp = null;
        }
        newListNode.next = tmp;

        return result.next;
    }

你可能感兴趣的:(leetcode,leetcode题解)