分隔链表(遍历法)

725. 分隔链表

​ 链表分解的话要让链表的末尾.next = null,这道题难度为中级可能只是结合了链表操作。

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode() {}
 *     ListNode(int val) { this.val = val; }
 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 * }
 */
class Solution {
    /**
    len =3  k=5 k = 3   3/ 5 = 0  3 %5=3 均摊到前3个
    len =10 k=3 k = 3   10/3 = 3  10%3=1 均摊到前1个 

    这个实际上是把链表分片
     */
    public ListNode[] splitListToParts(ListNode head, int k) {

        ListNode[] res = new ListNode[k];
        //第一部分  遍历得到链表长度
        int len = 0;
        ListNode p = head;
        while(p !=null){
            len++;
            p = p.next;
        }

        // 第二部分 处理数据
        int groupNums = len/k;
        int leave = len%k;

        ListNode pointer = head;

        for(int i=0;i<k&&pointer!=null;i++){
            //实现分摊  实际上是分摊到前  leave个
            /**
            leave = 3 分摊到0,1,2上
             */
            res[i] = pointer;
            int partSize = groupNums;
            if(i<leave){
                //如果在分摊范围内就进行分摊
                partSize++;
            }
            for(int j =1;j<partSize;j++){
                pointer=pointer.next;
            }

            //利用指针  让链表断开 当前pointer在断开节点的最后,不能丢下next,而且要砍断 当前.next = null
            ListNode next = pointer.next;
            pointer.next = null;
            pointer = next;
            
        }

        return res;


    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值