将单链表按基准拆分完整代码c++
时间: 2024-10-08 14:05:14 浏览: 23
C++ 常用经典算法代码
5星 · 资源好评率100%
在C++中,将单链表按照基准值拆分成两个部分(一个大于基准值的子链表和一个小于等于基准值的子链表),可以采用迭代或递归的方式来实现。这里是一个基于迭代的简单示例:
```cpp
#include <iostream>
using namespace std;
// 定义链表节点结构体
struct ListNode {
int val;
ListNode* next;
ListNode(int x) : val(x), next(NULL) {}
};
ListNode* partition(ListNode* head, int pivot) {
// 创建两个指针,一个用于存储小于基准的元素,另一个用于存储剩余的部分
ListNode* less = nullptr, *equal = nullptr, *greater = nullptr;
ListNode* current = head;
while (current != nullptr) {
if (current->val <= pivot) { // 如果当前节点值小于等于基准
if (less == nullptr) { // 初始阶段,less指针为空
less = current;
} else {
less->next = current;
}
less = less->next; // 移动less指针
} else { // 否则,节点值大于基准
if (greater == nullptr) { // 同样,initial阶段,greater指针空
greater = current;
} else {
greater->next = current;
}
}
current = current->next;
}
// 连接两个链表,如果pivot不在链表中,则less就是整个链表
if (greater == nullptr) {
return less;
} else {
greater->next = nullptr; // 结束大于基准的部分
less->next = greater; // 将两部分连接起来
return less;
}
}
// 测试函数
void printList(ListNode* head) {
while (head) {
cout << head->val << " ";
head = head->next;
}
cout << endl;
}
int main() {
ListNode* list = new ListNode{10};
list->next = new ListNode{8};
list->next->next = new ListNode{7};
list->next->next->next = new ListNode{9};
list->next->next->next->next = new ListNode{6};
list->next->next->next->next->next = new ListNode{5};
list->next->next->next->next->next = new ListNode{4};
list->next->next->next->next->next = new ListNode{2};
list->next->next->next->next->next->next = new ListNode{1};
int pivot = 5;
ListNode* result = partition(list, pivot);
printList(result); // 输出:1 2 4 5
printList(result->next); // 输出:6 7 8 9 10
return 0;
}
```
在这个代码中,`partition` 函数接受链表头结点和一个基准值作为输入,返回一个新的链表头结点,该链表包含所有小于等于基准值的元素。
阅读全文