4) 请百科自学链表数据结构,并假设有如下链表结点类listnode和链表类list,请设计链表类list的必要成员数据和成员函数,例如链表结点的添加、删除等。在主函数中,人为由整型数组构造一个链表,并实现链表整数序列的反向输出。
时间: 2023-06-28 12:09:55 浏览: 116
链表是一种常用的数据结构,由一系列节点组成,每个节点包含了数据和指向下一个节点的指针。链表的优势在于可以动态地添加和删除节点,相比于数组,它的大小不需要提前确定,而且在插入或删除节点时不需要移动其他节点,因此效率更高。
链表结点类listnode的定义如下:
```cpp
class listnode {
public:
int val;
listnode* next;
listnode(int x) : val(x), next(nullptr) {}
};
```
链表类list的必要成员数据和成员函数如下:
```cpp
class list {
private:
listnode* head; // 链表头指针
public:
list() : head(nullptr) {} // 默认构造函数,初始化为空链表
void append(int val); // 在链表末尾添加一个节点
void remove(int val); // 删除值为val的节点
void reverse(); // 反转链表
void print(); // 打印链表
};
```
链表中的数据类型为int,因此我们需要添加一个节点时,只需要传入一个int参数val,即可创建一个新节点,代码如下:
```cpp
void list::append(int val) {
listnode* new_node = new listnode(val); // 创建新节点
if (head == nullptr) {
head = new_node; // 如果链表为空,新节点作为头节点
} else {
listnode* p = head;
while (p->next != nullptr) {
p = p->next; // 找到链表末尾
}
p->next = new_node; // 将新节点添加到末尾
}
}
```
删除节点时,需要遍历链表,找到值为val的节点,并将其从链表中删除,代码如下:
```cpp
void list::remove(int val) {
if (head == nullptr) {
return; // 如果链表为空,直接返回
}
if (head->val == val) {
listnode* tmp = head;
head = head->next;
delete tmp; // 如果头节点就是要删除的节点,直接删除
return;
}
listnode* p = head;
while (p->next != nullptr && p->next->val != val) {
p = p->next; // 找到要删除的节点的前一个节点
}
if (p->next != nullptr) {
listnode* tmp = p->next;
p->next = tmp->next;
delete tmp; // 删除节点
}
}
```
反转链表时,需要遍历链表,将每个节点的next指针指向它的前一个节点,代码如下:
```cpp
void list::reverse() {
listnode* pre = nullptr;
listnode* cur = head;
while (cur != nullptr) {
listnode* nxt = cur->next; // 保存下一个节点
cur->next = pre; // 反转指针
pre = cur;
cur = nxt;
}
head = pre; // 头指针指向反转后的第一个节点
}
```
打印链表时,只需要遍历链表,将每个节点的值打印出来,代码如下:
```cpp
void list::print() {
listnode* p = head;
while (p != nullptr) {
cout << p->val << " ";
p = p->next;
}
cout << endl;
}
```
在主函数中,我们可以根据给定的整型数组构造一个链表,并将链表反向输出,代码如下:
```cpp
int main() {
int a[] = {1, 2, 3, 4, 5};
int n = sizeof(a) / sizeof(int);
list l;
for (int i = 0; i < n; i++) {
l.append(a[i]); // 构造链表
}
l.reverse(); // 反转链表
l.print(); // 输出链表
return 0;
}
```
输出结果为:5 4 3 2 1
阅读全文