C++对1.分隔链表 要求有main函数,包括create链表(参考期中考试) 给你一个头结点为 head 的单链表和一个整数 k ,请你设计一个算法将链表分隔为 k 个连续的部分。 每部分的长度应该尽可能的相等:任意两部分的长度差距不能超过 1 。这可能会导致有些部分为 null 。 这 k 个部分应该按照在链表中出现的顺序排列,并且排在前面的部分的长度应该大于或等于排在后面的长度。 返回一个由上述 k 部分组成的数组
时间: 2024-02-21 15:02:10 浏览: 144
好的,我理解了您的问题。下面是C++代码实现:
```c++
#include <iostream>
#include <vector>
using namespace std;
struct ListNode {
int val;
ListNode *next;
ListNode(int x) : val(x), next(NULL) {}
};
vector<ListNode*> splitListToParts(ListNode* head, int k) {
vector<ListNode*> res(k, nullptr);
int len = 0;
for (ListNode* p = head; p; p = p->next) ++len;
int n = len / k, r = len % k;
ListNode* p = head, *prev = nullptr;
for (int i = 0; p && i < k; ++i, --r) {
res[i] = p;
for (int j = 0; j < n + (r > 0); ++j) {
prev = p;
p = p->next;
}
prev->next = nullptr;
}
return res;
}
int main() {
// 创建链表
ListNode* head = new ListNode(1);
head->next = new ListNode(2);
head->next->next = new ListNode(3);
head->next->next->next = new ListNode(4);
head->next->next->next->next = new ListNode(5);
// 分隔链表
vector<ListNode*> parts = splitListToParts(head, 3);
for (int i = 0; i < parts.size(); ++i) {
cout << "Part " << i + 1 << ": ";
ListNode* p = parts[i];
while (p) {
cout << p->val << " ";
p = p->next;
}
cout << endl;
}
return 0;
}
```
这段代码中,我们使用了 `vector` 来存储分隔后的链表。首先计算链表长度 `len`,然后计算每个部分的长度 `n = len / k` 和余数 `r = len % k`。接下来我们遍历链表,将每个部分的头结点存储到 `vector` 中,然后将链表断开,重复上述步骤,最后返回 `vector` 即可。
运行结果如下:
```
Part 1: 1 2
Part 2: 3 4
Part 3: 5
```
这里我们将长度尽可能相等的策略应用到了每个部分中,因此部分 1 和 2 的长度相等,部分 3 的长度比它们短 1。
阅读全文