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日

相关文章

  • 怎么看电脑是64位还是32位 电脑32位和64位的区别

    怎么看电脑是64位还是32位 要确定电脑是64位还是32位,可以按照以下步骤进行操作: 打开“开始菜单”:点击屏幕左下角的Windows图标,或者按下键盘上的Windows键。 打开“设置”:在开始菜单中,点击齿轮状的“设置”图标。 进入“系统”设置:在设置窗口中,点击“系统”选项。 查看系统信息:在系统设置窗口中,选择左侧的“关于”选项。 查看系统类型:在…

    other 2023年7月28日
    00
  • Qt基于QScrollArea实现界面嵌套移动

    Qt基于QScrollArea实现界面嵌套移动攻略 1. 简介 QScrollArea是Qt中的一个小部件,用于在一个可滚动的视图中显示另一个小部件。通过使用QScrollArea,我们可以实现界面的嵌套移动效果,即在一个小部件内部滚动另一个小部件。 2. 实现步骤 下面是实现界面嵌套移动的步骤: 步骤1:创建主窗口 首先,我们需要创建一个主窗口,用于容纳所…

    other 2023年7月28日
    00
  • selenium3.0+python之环境搭建的方法步骤

    下面是详细的”Selenium3.0+Python之环境搭建的方法步骤”攻略。 安装 Python 访问Python官网(https://www.python.org/downloads/),选择下载Python 3.x版本的安装包; 根据操作系统选择安装包类型,Windows系统选择.exe文件,macOS和Linux选择.tgz或.dmg文件; 下载安装…

    other 2023年6月27日
    00
  • javascript使用正则表达式检测IP地址

    JavaScript使用正则表达式检测IP地址攻略 IP地址是网络通信中常用的标识符,使用正则表达式可以方便地检测IP地址的有效性。下面是使用JavaScript进行IP地址检测的完整攻略。 步骤1:编写正则表达式 首先,我们需要编写一个正则表达式来匹配IP地址的格式。IP地址由四个数字组成,每个数字的取值范围是0到255。正则表达式可以使用\\d来匹配数字…

    other 2023年7月30日
    00
  • SpringBoot 如何添加容器启动的初始化逻辑的操作方法

    下面是关于SpringBoot添加容器启动的初始化逻辑的完整攻略。 1. 概述 在SpringBoot中,我们可以通过添加容器启动的初始化逻辑来对应用进行一些自定义操作,例如初始化数据源连接池、加载定时任务等。 在整个启动过程中,SpringBoot会在特定的时刻调用我们设置的初始化逻辑接口。 2. 添加初始化逻辑 2.1 通过实现接口方式 对于简单的场景,…

    other 2023年6月20日
    00
  • transactionscope是什么

    Transactionscope 是什么? TransactionScope 是 .NET Framework 中的一个类,用于管理事务的范围。它提供了一种简单的方法来处理跨多个资源的事务,例如数据库、消息队列和文件系统等。使用 TransactionScope 可以确保所有资源都在同一个事务中提交或回滚,从而保证数据的一致性和完整性。 Transactio…

    other 2023年5月6日
    00
  • MySQL对JSON类型字段数据进行提取和查询的实现

    MySQL对JSON类型字段的提取和查询,是MySQL 5.7及以上版本中的新增功能之一。JSON类型字段在存储结构上,采用的是变长字符串类型,表示的是JSON文本. 下面将会对此进行详细的介绍。 创建表格 首先,我们来创建一个名为users的表格,并在其中添加一个JSON类型字段数据示例,如下所示: CREATE TABLE users ( id INT …

    other 2023年6月25日
    00
  • 最新青龙面板2.10.2搭建+XDD-PLUS的保姆级教程

    最新青龙面板2.10.2搭建+XDD-PLUS的保姆级教程 介绍 青龙面板2.10.2是一款著名的网页版面板,可以管理各种客户端脚本、自动化工具。本教程将介绍如何在Ubuntu服务器上搭建青龙面板2.10.2,并添加XDD-PLUS的支持。 前置条件 Ubuntu服务器 超级管理员权限 nginx或者apache2服务器 步骤1:安装依赖 sudo apt …

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