编写一个程序exp2-6.cpp,以单链表的首结点值x为基将该单链表分割为两部分,使所有小于x的结点排在大于或等于x的结点之前
时间: 2024-12-14 20:22:31 浏览: 10
编写一个名为`exp2-6.cpp`的程序,用于基于给定的链表元素值`x`将其分割成两个子链表,可以按照以下步骤完成:
首先,我们需要定义一个简单的单链表结构,包含节点数据和指向下一个节点的指针:
```cpp
#include <iostream>
using namespace std;
// 定义链表节点结构体
struct ListNode {
int val; // 节点值
ListNode* next; // 指向下一个节点的指针
ListNode(int x) : val(x), next(nullptr) {} // 构造函数
};
```
接下来,我们创建一个函数来分割链表:
```cpp
ListNode* splitList(ListNode* head, int x) {
if (head == nullptr || head->next == nullptr) { // 如果链表为空或只有一个元素
return head;
}
ListNode* smallerHead = new ListNode(head->val); // 新链表头,保存小于x的节点
ListNode* largerHead = nullptr; // 新链表头,保存大于等于x的节点
// 遍历链表,根据值大小分隔节点
ListNode* current = head;
while (current != nullptr) {
if (current->val < x) { // 小于x,添加到smallerHead链表
smallerHead->next = current;
smallerHead = smallerHead->next;
} else { // 大于等于x,开始新链表
if (largerHead == nullptr) {
largerHead = current;
}
// 否则直接连接到现有较大的链表头部
current->next = nullptr;
largerHead->next = current;
}
current = current->next;
}
return smallerHead ? smallerHead : largerHead; // 返回较小的链表头
}
```
最后,在main函数中测试这个函数:
```cpp
int main() {
// 创建并初始化链表示例
ListNode* list = new ListNode(4);
list->next = new ListNode(2);
list->next->next = new ListNode(9);
list->next->next->next = new ListNode(5);
list->next->next->next->next = new ListNode(1);
int x = 5; // 分割值
ListNode* result = splitList(list, x);
// 输出结果链表
while (result != nullptr) {
cout << result->val << " ";
result = result->next;
}
return 0;
}
```
运行上述代码后,你会得到一个小于5的元素组成的链表和一个大于等于5的元素组成的链表。
阅读全文