什么是链表:
链表是一种基本的线性数据结构,它由一系列节点组成,每个节点包含数据和对下一个节点的引用。链表的每个节点都有一个存储数据的字段和一个指向下一个节点的指针。链表的起始节点称为头节点,指向第一个数据节点的指针称为头指针。链表的最后一个节点没有指向其他节点的指针,称为尾节点。
链表的主要优点在于它的动态特性和灵活性。与数组不同,链表不需要预先分配固定大小的存储空间,它可以在运行时根据需要动态地添加或删除节点。这使得链表在处理动态变化的场景中非常有用。此外,链表可以通过指针方便地进行节点的插入和删除操作,这在某些情况下可以提高效率。
链表的操作:
在C++中,链表的基本操作包括但不限于以下几种:
1. 创建链表:初始化一个链表,包括分配内存给头节点,并为头节点设置适当的指针。
#include <iostream>
struct ListNode {
int val; // 节点值
ListNode *next; // 指向下一个节点的指针
ListNode(int x) : val(x), next(NULL) {} // 构造函数
};
int main() {
// 创建头节点并分配内存
ListNode *head = new ListNode(0);
}
}
2. 遍历链表:通过指针依次访问链表中的每个节点,执行特定操作。
//遍历并打印链表
ListNode *cur = head->next;// 初始化当前指针为头节点的下一个节点
while (cur != NULL) {// 循环遍历链表
std::cout << cur->val << " ";// 访问当前节点的值并打印
cur = cur->next;//// 移动指针到下一个节点
3. 插入节点:在链表的指定位置插入一个新的节点。
void insertNode(ListNode *head, int val) {
ListNode *cur = head; // 创建一个指针 cur,指向链表的头节点
while (cur->next != NULL && cur->next->val < val) {
cur = cur->next; // 当 cur 指向的下一个节点不为空且其值小于要插入的值val时,继续向后移动cur指针
}
ListNode *node = new ListNode(val); // 创建一个新的节点 node,值为 val
node->next = cur->next; // 将 node 的 next 指向 cur 指向的下一个节点
cur->next = node; // 将 cur 指向的下一个节点指向新插入的节点 node
}
4. 删除节点:移除链表中的一个节点,并调整指针以保持链表的结构完整性。
void deleteNode(ListNode *head, int val) {
ListNode *cur = head;
while (cur->next != NULL && cur->next->val != val) {
cur = cur->next;
}
if (cur->next != NULL) {
ListNode *temp = cur->next;
cur->next = cur->next->next;
delete temp;
}
}
5. 查找节点:在链表中寻找具有特定值的节点。
ListNode* findNode(ListNode *head, int val) {
ListNode *cur = head;
while (cur != NULL && cur->val != val) {//使用一个循环遍历链表,直到找到值为val的节点或者到达链表末尾
cur = cur->next;//将cur指向下一个节点。
}
return cur;//返回指向值为val的节点的指针(即`cur`)
}
6. 更新节点:改变链表中某个节点的数据值。
void updateNode(ListNode *head, int oldVal, int newVal) {
ListNode *cur = head;
while (cur != NULL && cur->val != oldVal) {
cur = cur->next;
}
if (cur != NULL) {
cur->val = newVal;
}
}
7. 销毁链表:释放链表占用的所有内存资源。
void destroyList(ListNode *head) {
ListNode *cur = head;
while (cur != NULL) {
ListNode *temp = cur;
cur = cur->next;
delete temp;
}
}
本文介绍了链表作为一种动态数据结构的基本概念,重点讲解了如何在C++中实现链表的创建、遍历、插入、删除、查找和更新节点的功能,以及链表的销毁操作。
1633





