使用链表将顺序表(a1,a2,…,an)重新排列以a1为界的两部分:a1前面的值均比a1小,a1后面的值均比a1大(数据元素的类型为整型)c++代码
时间: 2024-09-20 16:05:50 浏览: 40
判断链表是否为回文链表leetcode-Solutions:算法问题的解决方案
你可以使用C++的双向链表(Doubly Linked List)来实现这个功能,因为双向链表可以在两个方向上遍历,这将方便我们分隔和移动节点。下面是一个简单的示例代码:
```cpp
#include <iostream>
using namespace std;
// 链表节点结构体
struct Node {
int data;
Node* prev; // 指向前一个节点的指针
Node* next; // 指向下一个节点的指针
};
// 初始化一个新节点
Node* createNode(int value) {
Node* newNode = new Node();
newNode->data = value;
newNode->prev = nullptr;
newNode->next = nullptr;
return newNode;
}
// 合并两个已排序的部分
void mergeParts(Node* head, int a1, Node* part1End) {
if (head == nullptr || part1End == nullptr) return;
Node* current = head;
while (current != nullptr && current->data <= a1) { // 找到第一个大于a1的节点
current = current->next;
}
if (current == nullptr) { // 如果整个列表都小于a1,直接把part1接在后面
part1End->next = head;
head->prev = part1End;
} else { // 否则,把part1插入到a1之后
part1End->next = current;
current->prev = part1End;
head->prev = part1End;
part1End->prev = head;
}
}
int main() {
int a1;
cout << "Enter the value of a1: ";
cin >> a1;
Node* listStart = nullptr; // 假设链表开始于nullptr
Node* part1 = nullptr; // 存储排序好的a1前面的部分
// 输入序列
int input;
cout << "Enter sequence elements (ending with -1): ";
while (cin >> input && input != -1) {
Node* newNode = createNode(input);
if (input > a1) { // 如果当前元素大于a1,它应该属于part1
if (part1 == nullptr) {
part1 = newNode;
listStart = part1;
} else {
newNode->prev = part1End;
part1End->next = newNode;
part1End = newNode;
}
} else {
// a1前面的部分
if (listStart == nullptr) listStart = newNode;
else {
newNode->prev = listStart->prev;
newNode->next = listStart;
listStart->prev->next = newNode;
listStart->prev = newNode;
}
}
}
// 将part1添加到链表
mergeParts(listStart, a1, part1);
// 输出结果
Node* temp = listStart;
while (temp != nullptr) {
cout << temp->data << " ";
temp = temp->next;
}
cout << endl;
return 0;
}
```
这个程序首先输入一系列整数,并按需要划分成两部分。当遇到`a1`时,将其后的所有元素放入part1中。然后在main函数中合并这两部分,使得`a1`之前的所有值小于`a1`,`a1`之后的所有值大于`a1`。
阅读全文