用C++编写线性表的应用算法:构造一个递增有序的正整数链表,实现链表分解为一个奇数表和一个偶数表,之后再将两个链表合并一个递减链表
时间: 2024-10-15 13:12:02 浏览: 99
在C++中,我们可以先创建一个`ListNode`结构体表示链表节点,包含整数值和指向下一个节点的指针。然后实现以下算法:
1. **构造递增有序的正整数链表**:
```cpp
struct ListNode {
int val;
ListNode* next;
ListNode(int x) : val(x), next(nullptr) {}
};
// 构造函数,将一系列正整数添加到链表
ListNode* construct_sorted_list(vector<int>& nums) {
if (nums.empty()) return nullptr;
ListNode* head = new ListNode(nums[0]);
ListNode* current = head;
for (int i = 1; i < nums.size(); ++i) {
if (nums[i] > current->val) {
current->next = new ListNode(nums[i]);
current = current->next;
} else {
// 如果值小于等于当前节点,则插入前面
while (current->next && current->next->val <= nums[i]) {
current = current->next;
}
current->next = new ListNode(nums[i]);
}
}
return head;
}
```
2. **分解奇偶链表**:
```cpp
ListNode* decompose_to_odd_even(ListNode* head) {
ListNode* oddHead = nullptr, *oddTail = nullptr;
ListNode* evenHead = nullptr, *evenTail = nullptr;
while (head) {
if (head->val % 2 == 0) {
if (!evenHead) {
evenHead = head;
evenTail = head;
} else {
evenTail->next = head;
evenTail = head;
}
} else {
if (!oddHead) {
oddHead = head;
oddTail = head;
} else {
oddTail->next = head;
oddTail = head;
}
}
head = head->next;
}
oddTail->next = nullptr;
if (evenHead) evenTail->next = nullptr;
return oddHead ? oddHead : evenHead;
}
```
3. **合并成递减链表**:
```cpp
ListNode* merge_to_decreasing(ListNode* odd, ListNode* even) {
if (!odd || !even) return odd ? odd : even;
ListNode* tail = odd;
if (even->val < odd->val) {
tail = even;
odd = even->next;
}
while (odd && even) {
if (even->val < odd->val) {
tail->next = even;
tail = even;
even = even->next;
} else {
tail->next = odd;
tail = odd;
odd = odd->next;
}
}
tail->next = odd ? odd : even;
return evenHead;
}
```
现在你可以按照这个顺序使用这些函数。首先构造正整数链表,然后将其分解为奇数和偶数链表,最后合并这两个链表形成递减链表。
阅读全文