C++ 实现单链表创建、插入和删除

C++ 实现单链表创建、插入和删除的攻略如下:

创建单链表

创建一个单链表需要先定义一个链表节点结构体,包含两个元素:一个是节点的值,另一个是指向下一个节点的指针。

struct ListNode {
    int val;
    ListNode *next;
    ListNode(int x) : val(x), next(NULL) {}
};

定义好节点结构体之后,就可以通过循环来创建链表了。首先定义一个头节点,作为链表的起始节点,然后通过循环不断创建新的节点,并将其插入到链表中。

ListNode* createList(vector<int> nums) {
    ListNode *head = new ListNode(0);  // 创建头节点
    ListNode *tail = head;             // 将tail指向头节点,用于记录链表的尾节点
    for (auto num : nums) {
        ListNode *p = new ListNode(num);  // 创建新节点
        tail->next = p;                   // 将新节点插入到链表的尾部
        tail = p;                         // 更新尾节点
    }
    return head->next;  // 返回链表的第一个节点(头节点的next指向第一个节点)
}

这里采用了一个vector来存储链表的元素,方便数据的输入和处理。同时也可以手动输入链表元素,只需要将vector替换成类似int arr[]的形式即可。

以下示例展示如何创建一个包含3个元素{1, 2, 3}的单链表,并打印输出:

vector<int> nums = {1, 2, 3};
ListNode *head = createList(nums);

while (head != NULL) {
    cout << head->val << " ";
    head = head->next;
}
// 输出结果:1 2 3

插入节点

在单链表中插入节点要分两种情况:在指定位置插入新节点和在尾部插入新节点。

在指定位置插入新节点

在指定位置插入新节点,需要先找到插入节点的位置。可以通过循环遍历链表来实现,将遍历到的节点作为参照,找到插入节点的位置,然后将新节点插入到该位置。

ListNode* insertNode(ListNode *head, int index, int val) {
    if (index < 0) {  // 无效的插入位置,直接返回原链表
        return head;
    }
    ListNode *dummy = new ListNode(0);
    dummy->next = head;
    ListNode *prev = dummy;
    ListNode *cur = head;
    for (int i = 0; i < index && cur != NULL; i++) {
        prev = prev->next;
        cur = cur->next;
    }
    if (cur != NULL) {  // 找到插入位置,将新节点插入
        ListNode *p = new ListNode(val);
        prev->next = p;
        p->next = cur;
    }
    return dummy->next;
}

该函数需要传入链表的头节点、插入位置(从0开始)和插入节点的值。其中,dummy节点是为了避免链表头部插入时需要单独处理的情况。

以下示例展示如何在链表的第二个位置插入新节点4,并打印输出:

vector<int> nums = {1, 2, 3};
ListNode *head = createList(nums);

head = insertNode(head, 1, 4);

while (head != NULL) {
    cout << head->val << " ";
    head = head->next;
}
// 输出结果:1 4 2 3

在尾部插入新节点

在尾部插入新节点,可以直接遍历到链表的尾节点,然后将新节点插入到其后面。

ListNode* insertNode(ListNode *head, int val) {
    ListNode *dummy = new ListNode(0);
    dummy->next = head;
    ListNode *prev = dummy;
    ListNode *cur = head;
    while (cur != NULL) {  // 遍历链表,找到尾节点
        prev = prev->next;
        cur = cur->next;
    }
    ListNode *p = new ListNode(val);  // 在尾部插入新节点
    prev->next = p;
    return dummy->next;
}

该函数需要传入链表的头节点和插入节点的值。

以下示例展示如何在链表的尾部插入新节点4,并打印输出:

vector<int> nums = {1, 2, 3};
ListNode *head = createList(nums);

head = insertNode(head, 4);

while (head != NULL) {
    cout << head->val << " ";
    head = head->next;
}
// 输出结果:1 2 3 4

删除节点

在单链表中删除节点同样需要分两种情况:删除指定位置的节点和删除值等于指定值的节点。

删除指定位置的节点

在删除指定位置的节点时,首先也需要找到该节点的位置,然后将该节点从链表中删除。

ListNode* deleteNode(ListNode *head, int index) {
    if (index < 0) {  // 无效的删除位置,直接返回原链表
        return head;
    }
    ListNode *dummy = new ListNode(0);
    dummy->next = head;
    ListNode *prev = dummy;
    ListNode *cur = head;
    for (int i = 0; i < index && cur != NULL; i++) {
        prev = prev->next;
        cur = cur->next;
    }
    if (cur != NULL) {  // 找到要删除的节点,将其从链表中删除
        prev->next = cur->next;
        delete cur;
    }
    return dummy->next;
}

该函数需要传入链表的头节点和要删除的节点位置。

以下示例展示如何删除链表的第二个节点,并打印输出:

vector<int> nums = {1, 2, 3};
ListNode *head = createList(nums);

head = deleteNode(head, 1);

while (head != NULL) {
    cout << head->val << " ";
    head = head->next;
}
// 输出结果:1 3

删除值等于指定值的节点

在删除值等于指定值的节点时,需要遍历整个链表,找到值等于指定值的节点,并将其删除。

ListNode* deleteNode(ListNode *head, int val) {
    ListNode *dummy = new ListNode(0);
    dummy->next = head;
    ListNode *prev = dummy;
    ListNode *cur = head;
    while (cur != NULL) {  // 遍历链表,找到要删除的节点
        if (cur->val == val) {
            prev->next = cur->next;
            delete cur;
            break;
        }
        prev = prev->next;
        cur = cur->next;
    }
    return dummy->next;
}

该函数需要传入链表的头节点和要删除的节点的值。

以下示例展示如何删除链表中值等于2的节点,并打印输出:

vector<int> nums = {1, 2, 3};
ListNode *head = createList(nums);

head = deleteNode(head, 2);

while (head != NULL) {
    cout << head->val << " ";
    head = head->next;
}
// 输出结果:1 3

以上就是C++实现单链表创建、插入和删除的完整攻略和两条示例说明。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C++ 实现单链表创建、插入和删除 - Python技术站

(0)
上一篇 2023年6月27日
下一篇 2023年6月27日

相关文章

  • html实现时间轴_纯css实现响应式竖着/垂直时间抽布局效果

    HTML实现时间轴-纯CSS实现响应式竖着/垂直时间线布局效果 时间轴是现代网站设计中非常流行的一种设计元素。在该设计元素中,一系列日期和事件以时间线的形式展示出来。在本文中,我们将讨论如何使用HTML和CSS实现一个响应式、垂直排列的时间轴布局。 HTML代码结构 为了实现时间轴布局,我们需要定义一些HTML元素,如 ul、li、p等。下面是时间轴布局HT…

    其他 2023年3月28日
    00
  • pytorch实现resnet34网络

    PyTorch实现ResNet34网络的完整攻略 ResNet是深度学习中非常流行的卷积神经网络之一,它在ImageNet数据集上取了常好的效果。本文将详细讲解如何使用PyTorch实现ResNet34网络,包数据预处理、网络搭建、训和测试等内容。 数据预处理 在使用PyTorch实现ResNet34网络之前,需要对数据进行预处理。可以按照以下步骤预处理: …

    other 2023年5月8日
    00
  • Mysql和文件系统的关联详情

    MySQL和文件系统有着密切的关联,下面将详细介绍它们之间的关系以及如何优化这种关系。 文件系统与MySQL之间的关系 MySQL作为一个关系型数据库管理系统,需要将数据存储在硬盘上。在Linux系统中,MySQL的存储需要由文件系统完成。文件系统将数据存储在磁盘上,MySQL通过文件系统将数据读取到内存中。 MySQL的存储引擎包括MyISAM和InnoD…

    other 2023年6月27日
    00
  • c++virtualvoidvsnovirtual

    C++中virtual和非virtual函数的区别 在C++中,virtual和非virtual函数的区别在于是否支持多态。本文将详细讲解virtual和非virtual函数的区别,包括使用场景、实现方式、示例等内容。 virtual函数 在C++中,virtual函数是支持多态的。当一个类中的函数被声明为virtual时,可以被子类重写,从而实现多态。以下…

    other 2023年5月8日
    00
  • python如何派生内置不可变类型并修改实例化行为

    要派生内置不可变类型并修改实例化行为,我们需要使用Python中的元类(metaclass)。首先,让我们来了解一下Python中元类的概念。 Python中的元类 元类可以作为类的模板,控制类的创建过程。我们可以通过定义元类来修改类的定义方式、类的属性和方法等。 在Python中,每个类实际上都是通过元类来创建的。Python中默认的元类是type类,它掌…

    other 2023年6月27日
    00
  • 如何查找YUM安装的JAVA_HOME环境变量详解

    如何查找YUM安装的JAVA_HOME环境变量详解 在Linux系统中,JAVA_HOME环境变量是非常常见的,它通常用于确定JDK的安装位置和可执行文件路径。如果你使用YUM来安装JDK,那么有时候你需要找到JAVA_HOME环境变量的位置以便于配置相关软件的使用。 下面是查找YUM安装的JAVA_HOME环境变量的详细过程: 步骤一:查看Java安装路径…

    其他 2023年3月28日
    00
  • Spring Boot详解配置文件有哪些作用与细则

    Spring Boot详解配置文件有哪些作用与细则 简介 在Spring Boot应用中,配置文件是非常重要的一部分。它能够让我们配置应用的各种环境参数,以便应用能够更好地运行。Spring Boot使用属性文件和yaml文件作为配置文件格式,使得我们可以在应用中轻松地配置和管理参数。 配置文件名称 Spring Boot应用使用的默认配置文件名称是appl…

    other 2023年6月25日
    00
  • vue前端开发层次嵌套组件的通信详解

    Vue前端开发层次嵌套组件的通信详解攻略 在Vue前端开发中,组件的通信是一个重要的概念。当组件层次嵌套较深时,组件之间的通信可能会变得复杂。本攻略将详细介绍Vue中层次嵌套组件的通信方式,并提供两个示例说明。 1. 父子组件通信 父子组件通信是最常见的场景之一。在Vue中,父组件可以通过props向子组件传递数据,子组件可以通过事件向父组件发送消息。 示例…

    other 2023年7月27日
    00
合作推广
合作推广
分享本页
返回顶部