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

yizhihongxing

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日

相关文章

  • 鼠标右键的普通背景怎么更换为漂亮的菜单背景?

    下面是“鼠标右键的普通背景怎么更换为漂亮的菜单背景?”的完整攻略。 背景知识 首先,我们需要知道一些背景知识。在 Windows 操作系统中,鼠标右键点击之后弹出的菜单叫做“上下文菜单”,也被称为“快捷菜单”。 Windows 系统提供了一些默认的快捷菜单样式,但是这些样式比较简单,不能满足用户的需求。因此,我们可以通过修改注册表来更换快捷菜单的背景图片,从…

    other 2023年6月27日
    00
  • 浅谈php的ci框架(一)

    浅谈PHP的CI框架(一) PHP是一种广泛使用的Web编程语言,已经被许多顶级网站采用,如Facebook、Wikipedia、Yahoo等。而在PHP的众多框架中,CodeIgniter(简称CI)是其中之一。 什么是CI框架? CI是一个开源的PHP框架,由EllisLab公司所开发,在MIT协议下发布。它是一个轻量级框架,主要设计目的是使WEB应用程…

    其他 2023年3月29日
    00
  • Linux如何扩展XFS文件系统以完全使用额外空间

    扩展XFS文件系统以完全使用额外空间的攻略需要以下步骤: 1.确认分区大小和使用情况 在使用XFS文件系统扩展前,需要确认磁盘分区的大小和使用情况。可以使用以下命令查看磁盘分区的大小和使用情况: df -h 2.增加磁盘分区 如果磁盘分区的空间不够用,需要增加磁盘分区的大小。可以使用fdisk命令来增加磁盘分区。以下是示例: sudo fdisk /dev/…

    other 2023年6月27日
    00
  • css样式的特点与优先选择权(优先级)

    CSS样式的特点与优先选择权(优先级) 特点 层叠性:多个CSS样式可以同时作用于同一个元素,通过层叠性可以在不修改HTML结构的情况下改变网页的样式。 继承性:子元素可以继承父元素的样式。例如,如果给父元素设置了字体颜色,子元素通常会继承这个颜色属性。 优先选择权 在CSS中,当多个样式规则同时应用到同一个元素时,会根据优先级的规则来决定最终生效的样式。 …

    other 2023年6月28日
    00
  • googleaviator:轻量级java公式引擎

    GoogleAviator: 轻量级Java公式引擎 GoogleAviator是一款轻量级的Java公式引擎,它可以解析和计算数学表达式,支持变量、函数、常量等。本文将介绍GoogleAviator的基本用法和示例。 安装 GoogleAviator可以通过Maven或Gradle添加依赖来使用。以下是Maven的配置示例: <dependency&…

    other 2023年5月8日
    00
  • java 中模拟TCP传输的客户端和服务端实例详解

    Java 中模拟 TCP 传输的客户端和服务端实例详解 本攻略将介绍如何使用 Java 编写模拟 TCP 传输的客户端和服务端程序。在本攻略中,我们将使用 Java 的 Socket 和 ServerSocket 类来实现 TCP 传输的功能。 前置知识 在开始本攻略之前,需要对以下知识点有一定的了解: Java 基础知识 TCP/IP 协议 Socket …

    other 2023年6月27日
    00
  • vue项目打包:修改dist文件名方式

    Vue项目打包:修改dist文件名方式 在Vue项目中,打包生成的dist文件夹包含了项目的静态资源文件。默认情况下,打包后的文件名是固定的,但您可以通过修改配置来自定义生成的dist文件名。以下是完整的攻略: 步骤1:修改配置文件 在Vue项目的根目录下,找到vue.config.js文件(如果没有则需要创建)。在该文件中,可以配置Vue项目的各种构建选项…

    other 2023年10月13日
    00
  • cnpm安装失败及解决方案

    以下是关于cnpm安装失败及解决方案的完整攻略,包括常见问题和两个示例说明。 常见问题 1. 安装失败 当使用cnpm安装时,可能会遇到以下错误: npm ERR! code ECONNRESET npm ERR! code EINTEGRITY npm ERR! code ENOENT npm ERR! code ENOTFOUND npm ERR! co…

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