已知附带加头结点的单链表
时间: 2024-03-10 22:48:50 浏览: 56
附带头结点的单链表是一种常见的链表结构,其特点是在链表头部添加一个额外的头结点,用于方便操作链表。头结点通常不存储数据,只包含一个指向链表第一个结点的指针。因此,在对链表进行操作时,需要特别注意头结点的影响。
以下是一个示例代码,展示如何创建、遍历、插入和删除附带头结点的单链表。
```c++
#include <iostream>
using namespace std;
// 定义链表结构体
struct ListNode {
int val;
ListNode *next;
ListNode(int x) : val(x), next(nullptr) {}
};
// 创建链表
ListNode* createList() {
int n;
cout << "请输入链表长度: ";
cin >> n;
ListNode* head = new ListNode(-1); // 创建头结点
ListNode* tail = head; // tail指向尾结点
for (int i = 0; i < n; ++i) {
int x;
cout << "请输入第" << i+1 << "个节点的值: ";
cin >> x;
ListNode* node = new ListNode(x);
tail->next = node; // tail的next指针指向新结点
tail = node; // tail指向新结点
}
return head;
}
// 遍历链表
void traverseList(ListNode* head) {
ListNode* p = head->next; // p指向第一个结点
while (p != nullptr) {
cout << p->val << " ";
p = p->next;
}
cout << endl;
}
// 插入结点
void insertNode(ListNode* head, int val) {
ListNode* node = new ListNode(val);
node->next = head->next; // 新结点的next指针指向第一个结点
head->next = node; // 头结点的next指针指向新结点
}
// 删除结点
void deleteNode(ListNode* head, int val) {
ListNode* p = head->next; // p指向第一个结点
ListNode* pre = head; // pre指向p的前一个结点
while (p != nullptr) {
if (p->val == val) {
pre->next = p->next; // pre的next指针指向p的下一个结点
delete p; // 释放p结点内存
return;
}
pre = p;
p = p->next;
}
}
int main() {
ListNode* head = createList();
cout << "原链表: ";
traverseList(head);
insertNode(head, 10);
cout << "插入结点后: ";
traverseList(head);
deleteNode(head, 3);
cout << "删除结点后: ";
traverseList(head);
return 0;
}
```
需要注意的是,在对链表进行操作时,需要注意空指针的情况,以及头结点和尾结点的区别。同时,为了避免内存泄漏,需要在释放结点内存时使用 `delete` 或 `delete[]`。
阅读全文