LeetCode725 分隔链表(平均切分链表)

分隔链表

在这里插入图片描述

package CLinkedList;

import com.sun.org.apache.bcel.internal.generic.NEW;

/**
 * @Author Zhou  jian
 * @Date 2020 ${month}  2020/4/11 0011  13:03
 */
public class Problem725 {

    //还没调试成功,不过基本就是这个速录
    public ListNode[] splitListToParts(ListNode root, int k) {

        //现获取链表的长度,然后计算每个部分应该分得几个
        //链表的长度为 n  则  每部分应分得的
        // perSegment =  n/k;但是还剩下sub = n%k;
        // 这sub应该分到钱sub中每个里面分一个


        if(root==null) return null;

        //1、获取链表的长度
        ListNode temp = root;
        int size = 0;
        while(temp!=null){
            size++;
            temp=temp.next;
        }

        //每个部分应该分得的节点数
        //每个部分应该分得的基础节点数
        int perSegment = size/k;
        //前sub个部分每个数组都多分一个节点  perSegment+1   1:sub
        int sub = size%k;

        //前sub个数组每个分得 perSegment+1个节点,之后的每个数组分得perSegment节点
        ListNode[] rs = new ListNode[k];

        //从第一个节点开始
        temp = root;

        int index =0;

        int indexInArray =0;

            //前sub个数组每个数组分perSegment+1节点
            for(int i=0;i<sub;i++){

                ListNode newHead = null;
                ListNode newHeadTemp=null;
               if(perSegment+1>=1){
                     newHead= temp;
                    newHeadTemp= newHead;
                    index++;
               }
                //每个数组分得perSegment+1个节点
                if(index<perSegment+1){
                    newHeadTemp.next=temp.next;
                    temp=temp.next;
                    newHeadTemp = newHeadTemp.next;
                    index++;
                }else{
                    newHeadTemp.next=null;
                    rs[indexInArray++]=newHead;
                    index=0;
                }

            }

            //从sub到k每个分perSegment节点
        for(int i=sub;i<k;i++){
            ListNode newHead = null;
            ListNode newHeadTemp=null;
            if(perSegment>=1){
                newHead= temp;
                newHeadTemp= newHead;
                index++;
            }
            //每个数组分得perSegment+1个节点
            if(index<perSegment){
                newHeadTemp.next=temp.next;
                temp=temp.next;
                newHeadTemp = newHeadTemp.next;
                index++;
            }else{
                newHeadTemp.next=null;
                rs[indexInArray++]=newHead;
                index=0;
            }

        }






    return  rs;


    }


    //题目给出的标准答案
    public ListNode[] splitListToParts1(ListNode root, int k) {
        ListNode cur = root;
        int N = 0;
        while (cur != null) {
            cur = cur.next;
            N++;
        }

        //切分链表
        int width = N / k, rem = N % k;

        ListNode[] ans = new ListNode[k];
        cur = root;

        for (int i = 0; i < k; ++i) {
            ListNode head = cur;
            for (int j = 0; j < width + (i < rem ? 1 : 0) - 1; ++j) {
                if (cur != null) cur = cur.next;
            }
            if (cur != null) {
                ListNode prev = cur;
                cur = cur.next;
                prev.next = null;
            }
            ans[i] = head;
        }
        return ans;
    }


    public static void main(String[] args) {
        ListNode head = new ListNode(1);
        ListNode b = new ListNode(2);
        ListNode c = new ListNode(3);
        ListNode d = new ListNode(4);

        head.next=b;
        b.next=c;
        c.next=d;

        Problem725 problem725 = new Problem725();
        problem725.splitListToParts(head,5);

    }

}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值