使用cpp编写程序:对任意输入的一组数据,建立一个递增有序的单链表。 将单链表拆分成两个单链表,其中一个全为奇数,另一个全为偶数(尽量利用原存储空间)。 用递增有序的链表A、B表示两个集合,设计算法求它们的并集。 删除递增有序单链表中的重复元素。 求单循环链表中所有结点的最大值、最小值以及平均值。 判断双循环链表是否对称。
时间: 2023-05-14 14:04:54 浏览: 101
单链表算法实现.cpp
1. 对任意输入的一组数据,建立一个递增有序的单链表。
可以使用以下代码实现:
```cpp
#include <iostream>
using namespace std;
struct ListNode {
int val;
ListNode* next;
ListNode(int x) : val(x), next(NULL) {}
};
ListNode* insert(ListNode* head, int val) {
ListNode* node = new ListNode(val);
if (head == NULL || val < head->val) {
node->next = head;
head = node;
} else {
ListNode* cur = head;
while (cur->next != NULL && val > cur->next->val) {
cur = cur->next;
}
node->next = cur->next;
cur->next = node;
}
return head;
}
ListNode* createList() {
int n;
cin >> n;
ListNode* head = NULL;
for (int i = 0; i < n; i++) {
int val;
cin >> val;
head = insert(head, val);
}
return head;
}
```
2. 将单链表拆分成两个单链表,其中一个全为奇数,另一个全为偶数(尽量利用原存储空间)。
可以使用以下代码实现:
```cpp
void splitList(ListNode* head, ListNode*& oddHead, ListNode*& evenHead) {
ListNode* oddTail = NULL;
ListNode* evenTail = NULL;
ListNode* cur = head;
while (cur != NULL) {
if (cur->val % 2 == 0) {
if (evenHead == NULL) {
evenHead = evenTail = cur;
} else {
evenTail->next = cur;
evenTail = cur;
}
} else {
if (oddHead == NULL) {
oddHead = oddTail = cur;
} else {
oddTail->next = cur;
oddTail = cur;
}
}
cur = cur->next;
}
if (oddTail != NULL) {
oddTail->next = NULL;
}
if (evenTail != NULL) {
evenTail->next = NULL;
}
}
```
3. 用递增有序的链表A、B表示两个集合,设计算法求它们的并集。
可以使用以下代码实现:
```cpp
ListNode* merge(ListNode* head1, ListNode* head2) {
ListNode* dummy = new ListNode(0);
ListNode* cur = dummy;
while (head1 != NULL && head2 != NULL) {
if (head1->val < head2->val) {
cur->next = head1;
head1 = head1->next;
} else if (head1->val > head2->val) {
cur->next = head2;
head2 = head2->next;
} else {
cur->next = head1;
head1 = head1->next;
head2 = head2->next;
}
cur = cur->next;
}
if (head1 != NULL) {
cur->next = head1;
}
if (head2 != NULL) {
cur->next = head2;
}
return dummy->next;
}
```
4. 删除递增有序单链表中的重复元素。
可以使用以下代码实现:
```cpp
void deleteDuplicates(ListNode* head) {
ListNode* cur = head;
while (cur != NULL && cur->next != NULL) {
if (cur->val == cur->next->val) {
ListNode* temp = cur->next;
cur->next = cur->next->next;
delete temp;
} else {
cur = cur->next;
}
}
}
```
5. 求单循环链表中所有结点的最大值、最小值以及平均值。
可以使用以下代码实现:
```cpp
void findMinMaxAvg(ListNode* head) {
if (head == NULL) {
return;
}
ListNode* cur = head;
int sum = 0;
int count = 0;
int maxVal = head->val;
int minVal = head->val;
do {
sum += cur->val;
count++;
if (cur->val > maxVal) {
maxVal = cur->val;
}
if (cur->val < minVal) {
minVal = cur->val;
}
cur = cur->next;
} while (cur != head);
double avg = (double)sum / count;
cout << "Max: " << maxVal << endl;
cout << "Min: " << minVal << endl;
cout << "Avg: " << avg << endl;
}
```
6. 判断双循环链表是否对称。
可以使用以下代码实现:
```cpp
bool isSymmetric(ListNode* head) {
if (head == NULL) {
return true;
}
ListNode* left = head;
ListNode* right = head->prev;
while (left != right && left->prev != right) {
if (left->val != right->val) {
return false;
}
left = left->next;
right = right->prev;
}
return true;
}
```
阅读全文