数据结构经典面试之链表——C#和C++篇

文章目录

  • 一、链表的基本概念
  • 二、链表的操作
  • 三、定义链表的节点结构体(C#)
  • 四、定义链表的基本操作类(C#)
  • 五、创建一个链表实例并进行基本操作演示(C#)
  • 六、编写一个自定义链表操作函数(C++)
  • 七、在C++中演示创建和操作一个链表实例(C++)
  • 八、总结并对比C#和C++实现链表数据结构的不同点
  • 总结


在这里插入图片描述

链表是一种常见的基础数据结构,它由一系列节点组成,每个节点包含数据域和指向下一个节点的指针。链表与数组不同,它不要求节点在内存中连续存储,这使得链表在插入和删除操作时具有较高的效率。

本文将介绍链表的基本概念、操作以及在C#和C++语言中的实现。

一、链表的基本概念

节点(Node)
节点是链表的基本单元,它包含两个部分:数据域和指针域。数据域用于存储节点的数据,指针域用于存储下一个节点的地址。

单链表(Singly Linked List)
单链表是一种每个节点只有一个指针指向下一个节点的链表。它是链表的最基本形式。

双向链表(Doubly Linked List)
双向链表是一种每个节点有两个指针,一个指向前一个节点,另一个指向下一个节点的链表。这使得双向链表可以方便地访问节点的前驱和后继。

循环链表(Circular Linked List)
循环链表是一种最后一个节点的指针指向第一个节点的链表。这使得循环链表在末尾追加节点时更为方便。

二、链表的操作

  • 插入操作

插入操作包括在链表的头部、中间和尾部插入节点。

(1)在链表头部插入节点

在链表头部插入节点时,新节点的指针指向原头节点,然后将新节点设置为头节点。

(2)在链表中间插入节点

在链表中间插入节点时,需要找到插入位置的前一个节点,将新节点的指针指向原中间节点,然后将原中间节点的指针指向新节点。

(3)在链表尾部插入节点

在链表尾部插入节点时,需要找到链表的最后一个节点,将最后一个节点的指针指向新节点,然后将新节点设置为最后一个节点。

  • 删除操作

删除操作包括删除链表的头部、中间和尾部节点。

(1)删除链表头部节点

删除链表头部节点时,需要将头节点的指针指向下一个节点,然后将原头节点从链表中释放。

(2)删除链表中间节点

删除链表中间节点时,需要找到删除节点的前一个节点,将前一个节点的指针指向删除节点的下一个节点。

(3)删除链表尾部节点

删除链表尾部节点时,需要找到链表的最后一个节点的前一个节点,将最后一个节点的前一个节点的指针指向null。

三、定义链表的节点结构体(C#)

在C#中,我们首先定义链表的节点结构体,它包含数据域和指向下一个节点的指针。

public struct Node
{
    public int Data { get; set; }
    public Node Next { get; set; }

    public Node(int data)
    {
        Data = data;
        Next = null;
    }
}

四、定义链表的基本操作类(C#)

在C#中,我们定义一个链表类,包含基本操作方法,如插入、删除等。

public class LinkedList
{
    public Node Head { get; set; }

    public void InsertAtHead(int data)
    {
        var newNode = new Node(data);
        newNode.Next = Head;
        Head = newNode;
    }

    public void InsertAtTail(int data)
    {
        var newNode = new Node(data);
        if (Head == null)
        {
            Head = newNode;
            return;
        }

        var current = Head;
        while (current.Next != null)
        {
            current = current.Next;
        }

        current.Next = newNode;
    }

    public void DeleteAtHead()
    {
        if (Head == null)
        {
            return;
        }

        Head = Head.Next;
    }

    public void DeleteAtTail()
    {
        if (Head == null)
        {
            return;
        }

        if (Head.Next == null)
        {
            Head = null;
            return;
        }

        var current = Head;
        while (current.Next.Next != null)
        {
            current = current.Next;
        }

        current.Next = null;
    }
}

五、创建一个链表实例并进行基本操作演示(C#)

下面我们创建一个链表实例,并演示如何进行基本操作。

public class Program
{
    public static void Main(string[] args)
    {
        LinkedList linkedList = new LinkedList();

        linkedList.InsertAtHead(1);
        linkedList.InsertAtHead(2);
        linkedList.InsertAtHead(3);
        linkedList.InsertAtTail(4);

        linkedList.DeleteAtHead();
        linkedList.DeleteAtTail();
    }
}

六、编写一个自定义链表操作函数(C++)

在C++中,我们首先定义链表的节点结构体,然后编写一个自定义链表操作函数,用于创建和打印链表。

#include <iostream>

struct Node
{
    int data;
    Node *next;

    Node(int data) : data(data), next(nullptr) {}
};

void printList(Node *head)
{
    Node *current = head;
    while (current != nullptr)
    {
        std::cout << current->data << " -> ";
        current = current->next;
    }
    std::cout << "null" << std::endl;
}

Node* createList(int arr[], int n) {
    Node* dummy = new Node(0);
    Node* tail = dummy;
    for (int i = 0; i < n; ++i) {
        Node* newNode = new Node(arr[i]);
        tail->next = newNode;
        tail = newNode;
    }
    return dummy->next;
}

七、在C++中演示创建和操作一个链表实例(C++)

下面我们在C++中演示如何创建和操作一个链表实例。

int main()
{
    int arr[] = {1, 2, 3, 4, 5};
    int n = sizeof(arr) / sizeof(arr[0]);

    Node* head = createList(arr, n);
    printList(head);

    // 删除链表的第一个节点
    Node* temp = head;
    head = head->next;
    delete temp;

    // 插入一个新节点到链表尾部
    Node* newNode = new Node(6);
    newNode->next = nullptr;
    temp = head;
    while (temp->next != nullptr)
    {
        temp = temp->next;
    }
    temp->next = newNode;

    printList(head);

    return 0;
}

八、总结并对比C#和C++实现链表数据结构的不同点

在C#中,我们使用结构体Node和类LinkedList来实现链表。C#是一种强类型语言,它提供了自动垃圾回收机制,这使得内存管理相对简单。在C#中,我们通过属性来访问和设置节点的Data和Next字段。

在C++中,我们使用结构体Node来实现链表节点,并使用指针来访问和设置节点的data和next字段。C++是一种静态类型语言,它不提供自动垃圾回收,因此我们需要手动管理内存,例如使用new和delete操作符。

在C#中,我们直接在LinkedList类中提供了基本操作方法,如InsertAtHead、InsertAtTail、DeleteAtHead和DeleteAtTail。而在C++中,我们定义了一个createList函数来创建链表,并使用printList函数来打印链表。

总结

总的来说,C#和C++实现链表的方式有一些不同,主要体现在内存管理、类型系统和编程习惯上。然而,无论是C#还是C++,链表的核心概念和基本操作都是相似的。通过理解和掌握链表的数据结构,我们可以更加高效地处理数据和优化程序性能。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/729714.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

react学习——09react中props属性

1、基本使用 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><!-- 移动端适配--><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>1_props基…

跨境电商-Ozon平台开店指南-魔行观察

商家入驻开店指南 第1步&#xff1a;注册并激活您的帐户 对于独联体以外的卖家&#xff1a;法人实体可以在平台上注册。如果您是个体经营户&#xff0c;请您首先开设一家公司。个体经营户&#xff08;土耳其的个体经营户除外&#xff09;不能在我们的平台上注册。 进行注册 …

qmt量化交易策略小白学习笔记第46期【qmt编程之期货行情数据--如何获取5档盘口行情、期货结算价与持仓量】

qmt编程之获取期货数据 qmt更加详细的教程方法&#xff0c;会持续慢慢梳理。 也可找寻博主的历史文章&#xff0c;搜索关键词查看解决方案 &#xff01; 感谢关注&#xff0c;咨询免费开通量化回测与获取实盘权限&#xff0c;欢迎和博主联系&#xff01; 获取5档盘口行情 …

高效文本编辑器:轻松掌握内容,批量删除每隔一行带有分隔符的内容,助力文本处理更高效!

在信息爆炸的时代&#xff0c;文本处理已成为我们日常生活和工作中不可或缺的一部分。然而&#xff0c;面对海量的文本内容&#xff0c;如何高效地进行编辑和整理&#xff0c;成为了许多人面临的难题。今天&#xff0c;我要向大家推荐一款高效文本编辑器——首助编辑高手&#…

如何在 MySQL 中创建和使用事务?

目录 1. 环境准备 2. 创建事务 3. 事务执行 4. 事务撤消 5. 总结 事务是数据库区别于文件系统的重要特征之一&#xff0c;当我们有了事务就会让数据库始终保持一致&#xff0c;同时我们还能通过事务机制恢复到某个时间点&#xff0c;这样可以保证已提交到数据库的修改不会…

mysql设置密码复杂度策略,登录失败次数限制

在配置文件中加入如下配置&#xff0c;重启mysql服务 [mysqld] #密码复杂度插件 plugin-load-addvalidate_password.so validate-passwordFORCE_PLUS_PERMANENT validate_password_policy2 # 0简单 1普通 2困难 validate_password_length9 # 密码长度限制 #登录失败次数、时间…

云服务器可以从哪些方面降低开发运维难度

开发和运维工作面临着诸多挑战&#xff0c;如果说现在市场上有可以快速有效解决的方案&#xff0c;那么云服务器绝对是首选&#xff0c;云服务器从多个方面显著降低了其难度。 具象到云服务器的特质中&#xff0c;不得不提的还是云服务器的弹性伸缩&#xff0c;之前的文章里有…

网络流量 数据包length计算

MTUMSSIP header(20 bytes)tcp header(20 bytes) lengthMTUEthernet header(14bytes) 其中MSS为Maximum Segment Size&#xff0c;即最大报文段长度&#xff0c;其受MTU大小影响&#xff0c;这里的MTU指的是三层的&#xff0c;二层的MTU固定为1500&#xff0c;不能修改。 MT…

推出RW610高度集成的低功耗无线MCU,带内置3频:1x1 Wi-Fi®6+ Bluetooth® Low Energy 5.4射频单元

RW610是一款高度集成的低功耗无线MCU&#xff0c;它集成了MCU和Wi-Fi6Bluetooth Low Energy (LE) 5.4射频单元&#xff0c;适用于多种应用&#xff0c;包括互联智能家居设备、游戏控制器、企业和工业自动化、智能配件和智能能源。 采用TFBGA145封装的系列器件&#xff1a;RW61…

docker curl:(56) Recv failure: Connection reset by peer

docker容器启动后&#xff0c;查看日志未发现错误&#xff0c;通过查询和分析&#xff0c;发现是期望容器打开的端口与容器实际打开的端口不一致导致。 1&#xff09;docker run -itd -p 8082:8082 vulfocus/log4j2-rce-2021-12-09:latest 2&#xff09;curl localhost:8082 …

移动端 UI 风格,彰显不凡

移动端 UI 风格&#xff0c;彰显不凡

一文读懂数据仓库ODS层

数据仓库一般分为三层&#xff0c;分别为数据贴源层&#xff08;ODS&#xff0c;Operation Data Store&#xff09;、数据公共层&#xff08;CDM&#xff0c;Common Data Model&#xff09;和数据应用层&#xff08;ADS&#xff0c;Application Data Service&#xff09;。其中…

java基于ssm+jsp 高校四六级报名管理系统

1前台首页功能模块 高校四六级报名管理系统&#xff0c;在系统首页可以查看首页、四六级报名、新闻资讯、我的、跳转到后台、在线客服等内容&#xff0c;如图1所示。 图1系统功能界面图 学生登录、学生注册&#xff0c;在注册页面可以填写学号、密码、姓名、学院、班级、手机、…

苹果智能和人工智能最大化

苹果智能和人工智能最大化 除了苹果公司&#xff0c;还没有人真正使用过苹果的智能功能。它要到秋天才会分阶段发布&#xff0c;即使到那时&#xff0c;它也无法在80%或90%的iPhone安装基础上运行&#xff0c;因为它需要只有iPhone 15 Pro才能使用的设备上处理功能。没有什么能…

无线模块433MHz和2.4GHz的功能与适用性比较

433MHz和2.4GHz这两个频段常用于无线通信中的模块&#xff0c;今天我们就来介绍这两种频段无线模块各自的特点。433MHz和2.4GHz无线模块工作频段都属于国内免许可的ISM开放频段&#xff0c;因此二者使用较为广泛。 433MHz频段无线模块位于超高频(UHF)范围内&#xff0c;具体频…

【0-1系列】从0-1快速了解搜索引擎是什么以及怎么用(上)

友情链接 社区开发版安装部署与使用教程社区版家族V2024.5版本更新说明 START>>1.快速了解搜索引擎 什么是搜索引擎数据库 搜索引擎数据库是一类专门用于数据内容搜索的NoSQL数据库&#xff0c;是非结构化大数据处理分析领域中重要的基础支撑软件。 伴随互联网、移动…

【element-ui】el-date-picker动态设置picker-options

<el-date-pickerv-model"formObj.startDate"type"date"placeholder"开始时间":picker-options"startPickerOptions"> </el-date-picker><el-date-pickerv-model"formObj.endDate"type"date"placeh…

全域外卖系统源码在哪些渠道值得推荐?

当前&#xff0c;全域外卖的热度持续飙升&#xff0c;并且隐隐有了大爆的趋势。许多创业者也因此有了进军全域外卖赛道的想法&#xff0c;以全域外卖系统源码在哪找为代表多个相关问题因此成为了多个创业者交流群的常客。 根据中国互联网络信息中心&#xff08;CNNIC&#xff0…

使用Python和BeautifulSoup轻松抓取表格数据

你是否曾经希望可以轻松地从网页上获取表格数据&#xff0c;而不是手动复制粘贴&#xff1f;好消息来了&#xff0c;使用Python和BeautifulSoup&#xff0c;你可以轻松实现这一目标。今天&#xff0c;我们将探索如何使用这些工具抓取中国气象局网站(http://weather.cma.cn)上的…

PySide(PyQt)利用回调和闭包定义信号与槽

如图3个按钮&#xff0c;均设为checkable&#xff0c;放置在一个groupbox内成为一个按钮组&#xff0c;要求实现的功能&#xff1a;当点击某个按钮时将本按钮设为选中&#xff08;setChecked(True)&#xff0c;并取消选中按钮站中的其他所有按钮&#xff08;setChecked(False)&…