C++详解如何实现单链表

下面我就来为大家详细讲解C++如何实现单链表。

创建链表节点

在C++中,我们通常使用结构体来表示链表节点,结构体中包括了数据域和指向下一个节点的指针域。代码如下:

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

在上面的代码中,val为节点中存储的数据,next为指向下一个节点的指针。我们使用一个构造函数来初始化节点,将参数x赋值给val,将next初始化为空指针。

添加节点

要向链表中添加节点,我们需要先找到链表的尾部,然后将新节点插入到尾部后面。具体代码如下:

void addNode(ListNode* &head, int val) {
    ListNode* newNode = new ListNode(val);
    if (head == nullptr) {
        head = newNode;
        return;
    }
    ListNode* cur = head;
    while (cur->next != nullptr) {
        cur = cur->next;
    }
    cur->next = newNode;
}

在上面的代码中,&head表示head是一个指针的引用,即我们可以通过修改head指针的值来改变链表的头节点。newNode是即将被插入到链表中的新节点。如果链表为空,那么直接将头指针指向新节点即可。如果链表不为空,则需找到链表的尾部,将指向新节点的指针赋值给尾节点的next指针。

删除节点

要删除链表中的一个节点,我们需要先找到目标节点,并记录其前驱节点。然后将前驱节点的next指针指向目标节点的下一个节点即可。需要注意的是,对于头节点的删除,我们需要特殊处理,代码如下:

void deleteNode(ListNode* &head, int val) {
    ListNode* dummy = new ListNode(-1);
    dummy->next = head;
    ListNode* cur = head;
    ListNode* pre = dummy;
    while (cur != nullptr) {
        if (cur->val == val) {
            pre->next = cur->next;
            if (head == cur) head = cur->next; // 对于头节点的删除
            break;
        }
        pre = cur;
        cur = cur->next;
    }
    head = dummy->next;
    delete dummy;
}

在上面的代码中,我们使用一个虚拟节点来记录头指针的前驱节点。如果另外使用一个指针指向头节点的话,头节点的删除操作会比较麻烦。if (head == cur) head = cur->next;是对于头节点的特殊处理,如果发现要删除的节点是头节点,那么需要修改头指针为新的头节点。

示例说明

下面给出两个示例,分别是向链表中添加节点和从链表中删除节点。代码如下:

ListNode* head = nullptr;
addNode(head, 1);
addNode(head, 2);
addNode(head, 3);

在上述示例中,我们首先定义了一个空链表,然后依次添加了值为1、2、3的三个节点。最终链表的头节点指向值为1的节点,链表中有3个元素。

ListNode* head = nullptr;
addNode(head, 1);
addNode(head, 2);
addNode(head, 3);
deleteNode(head, 2);

在上述示例中,我们仍然首先定义了一个空链表,并添加了值为1、2、3的三个节点。然后我们删除了值为2的节点,最终链表中有两个元素,头节点为值为1的节点,尾节点为值为3的节点。

以上就是C++实现单链表的详细攻略。需要注意的是,为了防止内存泄漏,我们在删除节点时需要手动释放内存,即调用delete函数。如有疑问,欢迎继续探讨。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C++详解如何实现单链表 - Python技术站

(0)
上一篇 2023年5月23日
下一篇 2023年5月23日

相关文章

  • JavaScript JSON.stringify()的使用总结

    以下是关于“JavaScript JSON.stringify()的使用总结”的完整攻略。 标题 介绍 在JavaScript中,JSON.stringify()是一种将JavaScript对象转换为JSON字符串的方法。它的作用是将一个对象序列化为一个JSON字符串,以便进行传输或存储,或者将其传递给一个将JSON格式数据作为输入的函数中。本文将探讨如何使…

    C 2023年5月23日
    00
  • JSON.parse()和JSON.stringify()使用介绍

    让我来详细讲解一下 JSON.parse() 和 JSON.stringify() 的使用介绍。 JSON.parse() JSON.parse() 方法用于将一个 JSON 字符串转换成一个 JavaScript 对象。 语法如下: JSON.parse(text[, reviver]) 其中,text 表示待转换的 JSON 字符串,reviver 是可…

    C 2023年5月23日
    00
  • C语言分支循环其嵌套语句的使用

    对于C语言程序,分支和循环结构都是非常重要的控制结构。它们可以让程序根据条件执行不同的操作,并可以利用循环结构让重复的操作更加简单和高效。 在实际编程中,分支和循环结构的嵌套使用能够更好地解决实际问题。下面我们分别讲解分支和循环在嵌套结构中的使用方法。 分支结构的嵌套使用 分支结构通常使用if / else或switch / case语句完成。分支结构的嵌套…

    C 2023年5月30日
    00
  • C语言实现简单的图书管理系统

    C语言实现简单的图书管理系统攻略 一、前期准备 在实现图书管理系统之前,需要先了解以下基础知识: 结构体的定义和使用 文件的读写操作 指针的使用 掌握以上基础知识,才能顺利实现图书管理系统。 二、功能需求 我们要实现的图书管理系统需要以下功能模块: 添加图书信息(包括图书名称、作者、价格等信息) 删除图书信息 修改图书信息 查找图书信息 显示所有图书信息 三…

    C 2023年5月22日
    00
  • C++特性之智能指针shared_ptr详解

    C++特性之智能指针shared_ptr详解 什么是智能指针? 智能指针是C ++中的一个重要特性,它可以避免内存泄漏和悬空指针的问题。智能指针是一个C ++类,它的析构函数自动释放分配的内存。最常见的智能指针有: unique_ptr shared_ptr weak_ptr 其中shared_ptr是引用计数智能指针。这种智能指针在控制对象之间的共享所有权…

    C 2023年5月22日
    00
  • 详解json string转换为java bean及实例代码

    下面是“详解json string转换为java bean及实例代码”的完整攻略: 什么是JSON JSON是一种轻量级的数据交换格式,具有易读易写、占用带宽小、易解析和支持多种语言等优点。在Web开发中,常用于数据传输和Web API。 JSON to Java Bean 转换 在Java中,我们可以通过JSON的转换将JSON字符串转换成Java Bea…

    C 2023年5月23日
    00
  • 基于C语言实现个人通讯录管理系统

    基于C语言实现个人通讯录管理系统攻略 1. 开发环境和工具 操作系统:Windows或Linux IDE:Visual Studio Code、Code::Blocks、Dev-C++等 编程语言:C语言 2. 需求分析 通讯录管理系统用于存储个人通讯信息,包括姓名、电话、地址等。通讯录管理系统可以实现添加、删除、修改、查找、显示等功能。 3. 设计思路 定…

    C 2023年5月30日
    00
  • 基于Matlab实现多目标粘液霉菌算法的示例代码

    为了实现多目标优化,我们可以使用粘液霉菌算法(NSGA-II)。该算法是一种遗传算法的变体,用于解决多目标优化问题。在这里,我们将讨论如何使用基于Matlab实现的NSGA-II示例代码来解决多目标优化问题。 步骤1:下载示例代码 您可以从Matlab官方网站上下载NSGA-II算法的示例代码。该示例代码可以帮助您实现多目标粘液霉菌算法。 步骤2:理解示例代…

    C 2023年5月23日
    00
合作推广
合作推广
分享本页
返回顶部