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

news2025/1/19 20:26:59

文章目录

  • 一、链表的基本概念
  • 二、链表的操作
  • 三、定义链表的节点结构体(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++,链表的核心概念和基本操作都是相似的。通过理解和掌握链表的数据结构,我们可以更加高效地处理数据和优化程序性能。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

搭建一个简单的xxljob

数据库表结构&#xff1a; YyJobInfo&#xff1a; public class YyJobInfo {//定时任务idprivate int id;//该定时任务所属的执行器的idprivate int jobGroup;//定时任务描述private String jobDesc;//定时任务添加的时间private Date addTime;//定时任务的更新时间private D…

centos7将jar包制作服务并设置开机服务

为了避免服务器因为一些原因重启导致java服务没启动&#xff0c;我们将jar包制作为service并开机启动 制作过程 在网上找了一些关于java jar包制作开启启动的&#xff0c;大致流程为先做一个xxx.service&#xff0c;放在/etc/systemd/system/目录下&#xff0c;然后执行syste…

ASP.NET Core 6.0 启动方式

启动方式 Visualstudio 2022启动 IIS Express IIS Express 是一个专为开发人员优化的轻型独立版本的 IIS。 借助 IIS Express,可以轻松地使用最新版本的 IIS 开发和测试网站。 控制台版面 直接在浏览器输入监听的地址,监听的是 http://localhost:5137 脚本启动 dotnet run…

交易中的特殊存在

在交易的广袤天空中&#xff0c;有一群特殊的存在——他们&#xff0c;是Eagle Trader。 他们以鹰眼般的洞察力&#xff0c;捕捉市场的微妙变化&#xff0c;每一次决策都如同猎食者般精准&#xff1b;他们运用策略&#xff0c;如同雄鹰在风中翱翔&#xff0c;利用风向&#xf…

Setapp AI 怎么样,值得订阅吗?

Setapp 是一款提供 240 多款 Mac 软件库&#xff0c;可以满足 Mac 和 iOS 用户的各种需求。只需支付一笔订阅费&#xff0c;就可以使用一系列应用程序&#xff0c;这些应用程序可以简化任务、提高创造力和组织工作流程。不过&#xff0c;Setapp 并不只注重应用程序的数量&#…

R语言——类与对象

已知2024年4月23日是星期五&#xff0c;编写一个函数day.in.a.week (x, y,z)&#xff0c;参数x和y和z分别代表年月日&#xff0c;判断这一天是否存在&#xff08;例如&#xff0c;2018年没有2月29日&#xff0c;也没有11月31日&#xff09;&#xff0c;如果不存在&#xff0c;返…

2024097期传足14场胜负前瞻

2024097期售止时间为6月22日&#xff08;周六&#xff09;20点30分&#xff0c;敬请留意&#xff1a; 本期14场由欧洲杯、美洲杯、美职联组成&#xff0c;1.5以下赔率2场&#xff0c;1.5-2.0赔率10场&#xff0c;其他场次是平半盘、平盘。本期14场难度中等。以下为基础盘前瞻&a…

针对河南大学数据结构傻逼学堂在线的自动化脚本

首先展示一下我们的答案 {1: [对象], 2: [关系]} {1: [非数值计算], 2: [操作]} {1: [线性表]} [D] [B] [B] [C] [C] {1: [操作]} {1: [数据关系, 数据对象上关系的集合]} {1: [性质相同]} {1: [物理结构]} {1: [存储结构, 操作表示]} [C] [B] [D] [B] [D] [true] [false] [fa…

css文字镂空加描边

css文字镂空加描边 <!DOCTYPE html> <html><head><meta charset"utf-8"><title>文字镂空</title><style>/* 公用样式 */html,body{width: 100%;height: 100%;position: relative;}/* html{overflow-y: scroll;} */*{margi…

(Python)可变类型不可变类型;引用传递值传递;浅拷贝深拷贝

从一段代码开始说事&#xff0c;先上代码&#xff1a; a [[1],[2],[3]] b [[4,5],[6,7],[7,8]] for i,j in zip(a,b):print(i,j)i [9]#i[0] 8j[:2][1,2]print(i, j) print(a) print(b) 运行的结果&#xff1a; [1] [4, 5] [9] [1, 2] [2] [6, 7] [9] [1, 2] [3] [7, 8] …

淘宝扭蛋机小程序:互联网时代下行业的发展动力

近几年&#xff0c;扭蛋机在潮玩市场风靡&#xff0c;与各类IP合作&#xff0c;推出各种新颖有趣的扭蛋商品&#xff0c;吸引了众多的IP粉丝&#xff0c;他们会通过扭蛋机进行抽奖&#xff0c;获得喜欢的商品。 目前&#xff0c;移动应用程序不断升级优化&#xff0c;“互联网…

RGB彩色模型理解与编程实例

一、引言 RGB彩色模型中的R、G和B为三原色&#xff0c;通常R、G和B分别用8位表示&#xff0c;因此24位的RGB 真彩色图像能表示16777216种颜色。在如右图所示RGB彩色立方体可知&#xff0c;任意两种原色混合可以合成一种新的颜色。红&#xff08;1&#xff0c;0&#xff0c;0&a…

番外篇 | YOLOv8算法解析和实战应用:车辆检测 + 车辆追踪 + 行驶速度计算

前言:Hello大家好,我是小哥谈。YOLOv8是ultralytics公司在2023年1月10号开源的,是YOLOv5的下一个重大更新版本,目前支持图像分类、物体检测和实例分割任务,在还没有开源时就收到了用户的广泛关注。它是一个SOTA模型,建立在以前YOLO版本的成功基础上,并引入了新的功能和改…

mock-前端数据模拟

简介 数据模拟不是开发流程中的必要一环 Json-server 简介&#xff1a; json-server 是一个简单的 Node.js 服务端应用程序&#xff0c;这个工具的主要作用是提供一个模拟的后端服务&#xff0c;可以在前端开发过程中独立于后端进行简单工作。 使用&#xff1a; 1、 安装…

CVPR 2024盛况空前,上海科技大学夺得最佳学生论文奖,惊艳全场

CVPR 2024盛况空前&#xff01;上海科技大学夺得最佳学生论文奖&#xff0c;惊艳全场&#xff01; 会议之眼 快讯 2024 年 CVPR &#xff08;Computer Vision and Pattern Recogntion Conference) 即国际计算机视觉与模式识别会议&#xff0c;于6月17日至21日正在美国西雅图召…

基于强化学习的目标跟踪论文合集

文章目录 2020UAV Maneuvering Target Tracking in Uncertain Environments Based on Deep Reinforcement Learning and Meta-LearningUAV Target Tracking in Urban Environments Using Deep Reinforcement Learning 2021Research on Vehicle Dispatch Problem Based on Kuhn-…

【面试题】风险评估和应急响应的工作流程

风险评估和应急响应是网络安全管理中两个重要的环节。下面分别介绍它们的工作流程&#xff1a; 一、风险评估工作流程&#xff1a; 1.确定评估范围&#xff1a;明确需要评估的信息系统或资产的范围。 2.资产识别&#xff1a;识别并列出所有需要评估的资产&#xff0c;包括硬件…

【自动驾驶】运动底盘状态数据:里程计、IMU、运动学分析、串口通信协议

文章目录 控制器与运动底盘状态数据:里程计、IMU运动学分析与轮子运动学分析公式串口通信控制与反馈通讯协议串口通信反馈上行数据帧解析串口通信控制下行数据帧解析代码实现IMU、里程计数据的获取、解析、计算控制器与运动底盘状态数据:里程计、IMU 控制器需要负责外发底盘…

剑指offer 算法题(搜索二维矩阵)

剑指offer 第二题 去力扣里测试算法 思路一&#xff1a; 直接暴力遍历二维数组。 class Solution { public:bool searchMatrix(vector<vector<int>>& matrix, int target) {for (unsigned int i{ 0 }; i < matrix.size(); i){for (unsigned int j{ 0 };…

ASP.NET Core 6.0 使用 Log4Net 和 Nlog日志中间件

前言 两年前,浅浅的学过 .NET 6,为啥要记录下来,大概是为了以后搭架子留下引线,还有抛砖引玉。 1. 环境准备 下载 建议使用 Visual Studio 2022 开发版 官网的下载地址:Visual Studio 2022 IDE - 适用于软件开发人员的编程工具借助 Visual Studio 设计,具有自动完成…