C++超详细分析单链表的实现与常见接口

yizhihongxing

C++超详细分析单链表的实现与常见接口

什么是单链表?

单链表,英文名为“Singly Linked List”,简称链表,是一种常用的数据结构,它是由若干个节点组成的,每个节点都包含了一个数据域和一个指向下一个节点的指针域。单链表的特点是以节点为单位,可以进行快速的插入和删除操作,但是随机访问就比较慢。

单链表的实现

定义节点类

在C++中,单链表可以通过类和指针来实现。首先我们需要定义一个节点类,包含数据和指向下一个节点的指针:

class Node {
public:
    int data; //数据
    Node* next; //指向下一个节点的指针
    Node(int _data): data(_data), next(nullptr) {}; //构造函数
};

其中,data是节点存储的数据,next是指向下一个节点的指针,构造函数用于初始化节点。在这里,我们将节点的指针初始化为nullptr,表示该节点没有指向任何其他节点。

定义链表类

接下来,我们需要定义一个链表类,包含链表的各种操作。

class LinkedList {
private:
    Node* head; //指向链表头节点的指针
    int length; //链表长度
public:
    LinkedList(): head(nullptr), length(0) {}; //构造函数
    ~LinkedList(); //析构函数
    void push_back(int data); //在链表末尾添加节点
    void insert(int index, int data); //在特定位置插入节点
    void remove(int index); //删除特定位置的节点
    int get(int index); //获取某一位置的节点数据
    int size(); //获取链表长度
};

其中,head是指向链表头节点的指针,length是链表长度。构造函数用于初始化链表,析构函数用于释放链表占用的内存。push_back函数将一个新节点插入到链表末尾,insert函数将一个新节点插入到链表的特定位置,remove函数将特定位置的节点从链表中删除,get函数用于获取链表中某一位置的节点的数据,size函数返回链表长度。

实现链表类中的各种操作

push_back函数

push_back函数用于在链表末尾添加节点。具体实现如下:

void LinkedList::push_back(int data) {
    Node* new_node = new Node(data); //创建新节点
    if (head == nullptr) {
        head = new_node; //如果链表为空,直接将头节点指向新节点
    } else {
        Node* p = head;
        while (p->next != nullptr) {
            p = p->next; //找到链表的尾节点
        }
        p->next = new_node; //将新节点插入到链表尾部
    }
    length++; //链表长度加1
}

首先创建一个新节点,在将其插入到链表尾部。如果链表为空,就将头节点指向新节点。否则,遍历链表找到尾节点,然后在将新节点插入到尾节点之后。最后更新链表长度。

insert函数

insert函数用于在链表的特定位置插入节点。具体实现如下:

void LinkedList::insert(int index, int data) {
    Node* new_node = new Node(data); //创建一个新节点

    if (index > length || index < 0) { //位置越界检查
        throw std::out_of_range("Index out of range!");
    }

    if (head == nullptr) {
        head = new_node; //如果链表为空,直接将头节点指向新节点
    } else if (index == 0) {
        new_node->next = head; //如果要插入的位置为0,直接插入到头节点之后
        head = new_node;
    } else {
        Node* p = head;
        for (int i = 1; i < index; i++) {
            p = p->next; //找到要插入位置的前一个节点
        }
        new_node->next = p->next; //将新节点插入到链表中
        p->next = new_node;
    }
    length++; //链表长度加1
}

首先创建一个新节点,然后判断要插入的位置是否越界。如果链表为空,直接将头节点指向新节点。如果插入的位置为0,直接插入到头节点之后。否则,遍历链表找到要插入位置的前一个节点,然后将新节点插入到链表中。最后更新链表长度。

remove函数

remove函数用于删除链表中特定位置的节点。具体实现如下:

void LinkedList::remove(int index) {
    if (index >= length || index < 0) { //位置越界检查
        throw std::out_of_range("Index out of range!");
    }

    Node* p = head;
    if (index == 0) {
        head = p->next; //删除头节点
    } else {
        for (int i = 1; i < index; i++) {
            p = p->next; //找到要删除的节点的前一个节点
        }
        Node* q = p->next; //要删除的节点
        p->next = q->next; //将删除节点的前后节点连接起来
        delete q; //释放删除节点的内存
    }
    length--; //链表长度减1
}

首先判断要删除的位置是否越界。如果要删除的是头节点,直接将头节点指向第二个节点。否则,遍历链表找到要删除节点的前一个节点,然后将要删除节点的前后节点连接起来,并释放要删除节点的内存。最后更新链表长度。

get函数

get函数用于获取链表中某一位置的节点的数据。具体实现如下:

int LinkedList::get(int index) {
    if (index >= length || index < 0) { //位置越界检查
        throw std::out_of_range("Index out of range!");
    }
    Node* p = head;
    for (int i = 0; i < index; i++) {
        p = p->next; //遍历链表找到特定位置的节点
    }
    return p->data; //返回该节点的数据
}

首先检查要获取的位置是否越界,然后遍历链表找到特定位置的节点,并返回该节点的数据。

size函数

size函数用于获取链表的长度。具体实现如下:

int LinkedList::size(){
    return length;
}

直接返回存储链表长度的变量。

示例

示例1

下面的示例演示了如何创建一个链表,并且向其中添加节点:

int main() {
    LinkedList list; //创建一个链表
    list.push_back(1); //在链表末尾添加节点
    list.push_back(2);
    list.push_back(3);
    for (int i = 0; i < list.size(); i++) {
        std::cout << list.get(i) << " "; //输出链表中各个节点的数据
    }
    return 0;
}

输出为:

1 2 3

示例2

下面的示例演示了如何创建一个链表,并删除其中的节点:

int main() {
    LinkedList list; //创建一个链表
    list.push_back(1);
    list.push_back(2);
    list.push_back(3);

    list.remove(1); //删除第2个节点之后

    for (int i = 0; i < list.size(); i++) {
        std::cout << list.get(i) << " "; //输出链表中各个节点的数据
    }
    return 0;
}

输出为:

1 3

以上示例演示了如何使用链表类中的操作来创建和修改一个链表的过程。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C++超详细分析单链表的实现与常见接口 - Python技术站

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

相关文章

  • vue实现骨架屏的示例

    Vue实现骨架屏的示例攻略 1. 什么是骨架屏? 骨架屏是一种用于优化用户体验的页面加载效果。它会先展示一个简单的页面结构,给用户一种页面正在加载的感觉,同时也提供了一种参照,让用户知道具体内容将要填充到哪个位置上。 2. 实现步骤 2.1 创建Vue项目 首先,我们需要创建一个Vue项目。可以使用Vue CLI来快速搭建项目结构。在命令行中执行以下命令: …

    other 2023年6月28日
    00
  • 联想lj2400l硒鼓打印机怎么清零?

    下面是“联想lj2400l硒鼓打印机怎么清零”的完整攻略,包含了过程和示例说明。 1. 了解硒鼓清零的概念 1.1 硒鼓清零的意义 硒鼓清零是一种重置打印机硒鼓寿命的方法,可以使打印机重新对硒鼓容量进行计数,让硒鼓寿命得到重新定义,从而达到节省成本的目的。 1.2 硒鼓清零的限制 硒鼓清零只能用于打印机硒鼓寿命计数器未达到上限的情况下,如果硒鼓寿命计数已经到…

    other 2023年6月27日
    00
  • Linux系统中tr命令删除和替换文本字符的基本用法

    当然!下面是关于\”Linux系统中tr命令删除和替换文本字符的基本用法\”的完整攻略: Linux系统中tr命令删除和替换文本字符的基本用法 在Linux系统中,可以使用tr命令来删除和替换文本字符。以下是两个示例: 示例1:删除文本中的字符 $ echo \"Hello, World!\" | tr -d ‘o’ 在这个示例中,我们使…

    other 2023年8月19日
    00
  • python如何对链表操作

    针对”python如何对链表操作”,我会详细讲解 Python 如何实现链表数据结构的操作,包括链表的构建、查找、插入、删除等操作。以下是完整攻略: 链表的概念 链表是一种常见的数据结构,它由若干结点组成,每个结点包含了数据和一个指向下一个结点的指针。链表中的结点是按照线性顺序排列的,并且在内存中不一定连续。 Python 中链表的实现 Python 中对链…

    other 2023年6月27日
    00
  • stm32之入门知识

    STM32之入门知识 STM32是一款基于ARM Cortex-M内核的微控制器,广泛应用于嵌入式系统开发。本文将提供一个完整的攻略,介绍STM32的入门知识,包括硬件和软件方面内容,并提供两个示例说明。 硬件 开发板 STM32开发板是学习和开发STM32的必备硬件常见的STM32开发板有ST官方的Nucleo系列、Discovery系列和EVAL系列,以…

    other 2023年5月8日
    00
  • win7系统重装搜狗输入法提示请您先重启电脑再进行操作的原因及解决方法

    原因解释 在 Windows 7 系统中,搜狗输入法作为一款第三方输入法软件,需要依赖于操作系统本身的一些模块和服务来运行。因此,在进行系统重装或者修改系统相关配置时,可能会影响到搜狗输入法的正常工作,导致出现提示“请您先重启电脑再进行操作”的情况。 具体来说,当操作系统或者其他应用程序对搜狗输入法所依赖的模块或服务进行更新、升级、安装或者卸载等操作时,搜狗…

    other 2023年6月27日
    00
  • Word2016中visio图像右键不能打开怎么办?

    如果 Word 2016 中 Visio 图像右键不能打开,可能是由于安装问题或配置设置问题导致的。下面提供一些可能有用的方法,帮助解决这个问题。 方法一:检查 Visio 安装 首先,需要确保 Visio 已经正确安装。如果安装过程中出现错误或问题,可能导致 Visio 图像在 Word 中无法打开。可以按照以下步骤检查 Visio 的安装情况。 打开“控…

    other 2023年6月27日
    00
  • Android Accessibility 辅助功能简单介绍

    Android Accessibility 辅助功能简单介绍 什么是 Android Accessibility Android Accessibility(Android 无障碍)是一种可以让使用设备上存在身体残疾的用户获得更广泛的访问软件和设备的能力的技术。 它包括一组 API,用于更容易地创建面向残疾人群体的应用程序。 Android Accessib…

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