一道综合性比较强的题,主要考察对链表的使用
给你一个头结点为 head 的单链表和一个整数 k ,请你设计一个算法将链表分隔为 k 个连续的部分。
每部分的长度应该尽可能的相等:任意两部分的长度差距不能超过 1 。这可能会导致有些部分为 null 。
这 k 个部分应该按照在链表中出现的顺序排列,并且排在前面的部分的长度应该大于或等于排在后面的长度。
返回一个由上述 k 部分组成的数组。
/**
* 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 {
public ListNode[] splitListToParts(ListNode head, int k) {
ListNode p = head;int len = 0;
//计算数组长度
while(p != null){
len++;
p = p.next;
}
//计算每段的长度,前rest段需多加一个节点
int part_len = len/k,rest = len % k;
// System.out.print(rest);
ListNode [] out_list = new ListNode[k];
p = head;
//按分段进行循环
for(int i = 0; i < k && p!= null; i++){
//使用哨兵节点记录段头结点
ListNode q = new ListNode(-1,p),x = q;
int j = 0;
//遍历每段内的节点,结束后x指向此段最后一个节点
while(p != null && j < part_len){
x.next = p;
p = p.next;
x = x.next;
j++;
}
//如果有剩余,这一段就得多遍历一个节点
if(rest > 0){
x.next = p;
x = x.next;
p = p.next;
rest--;
}
//最后就是断开这一段,同时记录断头结点到数组中
//注意这里p已经是下一段的段头了
x.next = null;
out_list[i] = q.next;
}
return out_list;
}
}