单向链表的有关操作,利用C++编写一个完整的代码1.随机产生或键盘输入一组元素,建立一个带头结点的单向链表(无序)。 2.遍历单向链表。 3.把单向链表中元素逆置(不允许申请新的结点空间)。 4.在单向链表中删除所有的偶数元素结点。
时间: 2024-12-20 20:31:58 浏览: 7
C++单向链表.rar
在C++中,我们可以使用`std::list`类来模拟单向链表,因为它提供了一种方便的方式来处理动态添加和删除元素。下面是一个完整的代码示例:
```cpp
#include <iostream>
#include <list>
using namespace std;
class ListNode {
public:
int val;
ListNode* next;
ListNode(int x) : val(x), next(nullptr) {}
};
// 生成随机元素
ListNode* generateRandomList(int n) {
srand(time(0));
list<int> random_list(n);
for (int i = 0; i < n; ++i) {
random_list.push_back(rand() % 100); // 生成0到99之间的随机数
}
return buildListFromRandom(random_list.begin(), random_list.end());
}
// 从迭代器构建链表
ListNode* buildListFromIterator(iterators_type it1, iterators_type it2) {
ListNode* head = nullptr;
ListNode* tail = nullptr;
while (it1 != it2) {
head = tail = new ListNode(*it1++);
tail->next = head;
}
return head;
}
// 遍历链表
void traverseList(ListNode* head) {
ListNode* temp = head;
while (temp != nullptr) {
cout << temp->val << " ";
temp = temp->next;
}
cout << endl;
}
// 逆置链表(不申请新空间)
ListNode* reverseList(ListNode* head) {
ListNode* prev = nullptr;
ListNode* curr = head;
ListNode* next = nullptr;
while (curr != nullptr) {
next = curr->next;
curr->next = prev;
prev = curr;
curr = next;
}
return prev;
}
// 删除链表中的偶数节点
ListNode* deleteEvenNodes(ListNode* head) {
ListNode* dummy = new ListNode(0);
dummy->next = head;
ListNode* prev = dummy;
ListNode* curr = head;
while (curr != nullptr) {
if (curr->val % 2 != 0) {
prev->next = curr->next;
} else {
delete curr;
}
prev = curr;
curr = prev->next;
}
dummy->next = nullptr;
return dummy->next;
}
int main() {
int n;
cout << "Enter the number of elements: ";
cin >> n;
ListNode* list = generateRandomList(n);
cout << "Original List: ";
traverseList(list);
list = reverseList(list);
cout << "Reversed List: ";
traverseList(list);
list = deleteEvenNodes(list);
cout << "List after deleting even numbers: ";
traverseList(list);
return 0;
}
```
在这个例子中,我们首先通过`generateRandomList`函数生成一个随机的链表,接着遍历链表,逆置链表,并删除偶数节点。每一步操作后都会打印出新的链表状态。
阅读全文