LeetCode25. Reverse Nodes in k-Group(每k个节点反转链表,java实现)

  • 问题描述

k个一组反转链表。

  • 解决方案

代码如下:


 public class ReverseKGroup {
    public static void main(String[] args){
        ListNode root = new ListNode(1);
        root.next = new ListNode(2);
        root.next.next = new ListNode(3);
        root.next.next.next = new ListNode(4);
        root.next.next.next.next = new ListNode(5);
        root.next.next.next.next.next = new ListNode(6);
        ListNode root2 = reverseKGroup(root,5);
        while(root2 != null){
            System.out.print(root2.val + "->");
            root2 = root2.next;
        }
    }

        public static ListNode reverseKGroup(ListNode head,int k){
            if(head == null)
                return head;
            ListNode[] arr = invertHelp(head,k);
            ListNode head2 = arr[0];
            ListNode result = head2;
            ListNode tail = arr[1];
            while(tail.next != null){
                ListNode[] temp = invertHelp(tail.next,k);
                tail.next = temp[0];
                tail = temp[1];
            }
            return result;
        }

        //给定一个链表,反转前k个节点,然后返回反转部分链表的头和尾
        public static ListNode[] invertHelp(ListNode root,int k){
            ListNode[] result = new ListNode[2];
            ListNode head = root;
            ListNode tail = root;
            result[0] = head;
            result[1] = tail;
            int size = 1;
            while(tail.next != null && size < k){
                ListNode next = tail.next.next;
                ListNode cur = tail.next;
                cur.next = head;
                head = cur;
                tail.next = next;
                result[0] = head;
                result[1] = tail;
                size ++;
            }
            if(size != k)
                return invertHelp( result[0],size);
            return result;
        }
    }
    
   class ListNode {
      int val;
      ListNode next;
      ListNode(int x) { val = x; }
  }

展开阅读全文
©️2020 CSDN 皮肤主题: 黑客帝国 设计师: 上身试试 返回首页
实付0元
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值