数据结构经典面试之链表——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++,链表的核心概念和基本操作都是相似的。通过理解和掌握链表的数据结构,我们可以更加高效地处理数据和优化程序性能。

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

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

相关文章

复分析——第4章——Fourier变换(E.M. Stein R. Shakarchi)

第4章 Fouier变换 Raymond Edward Alan Christopher Paley, Fellow of Trinity College, Cambridge, and International Research Fellow at the Massachusetts Institute of Technology and at Harvard University, was killed by an avalanche on April 7, 1933, whi…

鞠婧祎多个商标被丝芭传媒申请注册!

近日鞠婧祎与丝芭传媒合约引发网络关注&#xff0c;普推商标老杨经检索发现&#xff0c;丝芭传媒早在2016起就申请注册了“鞠婧祎”24个商标&#xff0c;涉及多个商标分类&#xff0c;这些基本都下商标注册证。 不管对经纪公司还是网红公司&#xff0c;有实力的基本都会对旗下的…

数据可视化实验四:Pyecharts数据可视化

目录 一、使用PyEcharts绘制全国肺炎确诊人数分布图 1.1 柱状图 1.1.2 代码实现 1.1.2 绘制结果 1.2 饼状图 1.2.1 代码实现 1.2.2 绘制结果 1.3 使用over lap实现图形叠加 1.3.1 代码实现 1.3.2 绘制结果 1.4 地图绘制-Map 1.4.1 代码实现 1.4.2 绘制结果 1.5 地…

51学习记录(一)——51介绍及震动感应灯

文章目录 前言一、STC89C522.内部结构及引脚 二、继电器原理及震动传感器原理三、项目搭建及实现 前言 一个学习嵌入式的小白~ 有问题评论区或私信指出 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考 一、STC89C52 1.简介 所属系列&#xff1a;51单…

功率电源中器件的温升与极限工作温度

功率电源中器件的温升与极限工作温度 熟悉电子电路设计的朋友一定都知道,在电源整体设计中存在一些发热非常严重的器件,如整流桥、MOS管、快恢复二极管这些器件。而在功率电源中,电感和高频变压器则成为了发热现象的重灾区。那么在功率电源中,它们的合理温升应该是多少,在…

计算机网络 VLAN间路由单臂路由

一、理论知识 VLAN是一种将物理网络划分成多个逻辑网络的方法。不同的VLAN属于不同的网段&#xff0c;因此互相通信需要通过路由器进行路由。通常情况下&#xff0c;在同一VLAN内的设备可以直接通信&#xff0c;而不同VLAN之间的设备则需要通过路由器转发数据。本实验利用单臂…

html--404页面

<!DOCTYPE html> <html> <head> <meta http-equiv"Content-Type" content"text/html; charsetUTF-8"> <meta http-equiv"X-UA-Compatible" content"IEedge,chrome1"> <title>404 错误页面不存在&…

适用于 AI/ML 工作负载的有状态 KES

在此概念验证 &#xff08;POC&#xff09; 中&#xff0c;我们将探讨在 Kubernetes &#xff08;k8s&#xff09; 生态系统中安装和管理有状态密钥加密服务 &#xff08;KES&#xff09;。本指南促进了加密操作的无缝衔接&#xff0c;而不会将敏感的密钥材料暴露给使用型应用程…

【2024最新精简版】线程安全/多线程 面试篇

文章目录 一. 线程基础线程和进程什么是进程什么是线程 并发与并行的区别创建线程继承Thread类实现Runable接口实现Callable接口使用线程池 线程状态等待唤醒机制等待方法唤醒方法 二. 线程池线程池作用创建线程池线程池任务调度流程阻塞队列 BlockingQueue线程池拒绝策略核心线…

只有程序员才能看懂的笑话

哈喽&#xff0c;大家好&#xff0c;我是明智 今天又是周五摸鱼日&#xff5e; 咱们不聊技术&#xff0c;看点别的有意思的东西 往期摸鱼记录&#xff1a; 》》》程序员的那些经典段子 》》》写出bug不用怕&#xff0c;世界就是一个巨大的草台班子 【1】二进制 世界上有10种人&…

随机链表的复制 排序链表

随机链表的复制 题目 . - 力扣&#xff08;LeetCode&#xff09; 思路&#xff1a; 思路&#xff1a; ①一个结点一个节点去拷贝&#xff0c;当拷贝了第一个节点的时候&#xff0c;把原节点与拷贝节点连接起来&#xff0c;直接到所有的节点拷贝完毕&#xff0c;这样做的目的…

专业技能篇---计算机网络

文章目录 前言计算机网络基础一、网络分层模型 HTTP一、从输入URL到页面显示发生了什么&#xff1f;二、Http的状态码有哪些&#xff1f;三、 HTTP与HTTPS有什么区别&#xff1f;四、URI 和 URL 的区别是什么?五、Cookie和Session有什么区别&#xff1f;六、GET与POST WebSock…

Android自定义View之不得不知道的文件attrs

其中demo_style如下:一般都是放的.9图片&#xff0c;为了方便就放个颜色了 ![在这里插入图片描述](https://img-blog.csdnimg.cn/20190820183209784.png?x-oss-processimage/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLm NzZG4ubmV0L3FxXzQyNzYxMz…

面向服务的架构(Service-Oriented Architecture, SOA)

目录 前言1. SOA的基本概念1.1 定义和特点1.2 核心原则 2. SOA的优势与挑战2.1 优势2.2 挑战 3. SOA的实现技术3.1 Web服务3.2 微服务架构3.3 企业服务总线&#xff08;ESB&#xff09; 4. SOA在现代企业中的应用4.1 金融行业4.2 电子商务4.3 政府和公共服务4.4 医疗健康 结语 …

EE trade:炒伦敦金的注意事项及交易指南

在贵金属市场中&#xff0c;伦敦金因其高流动性和全球认可度&#xff0c;成为广大投资者的首选。然而&#xff0c;在炒伦敦金的过程中&#xff0c;投资者需要注意一些关键点。南华金业小编带您一起来看看。 国际黄金报价 一般国际黄金报价会提供三个价格&#xff1a; 买价(B…

LeetCode 1-两数之和

LeetCode第1题 两数之和 给定一个整数数组 nums 和一个整数目标值 target&#xff0c;请你在该数组中找出 和为目标值 target 的那 两个 整数&#xff0c;并返回它们的数组下标。 你可以假设每种输入只会对应一个答案。但是&#xff0c;数组中同一个元素在答案里不能重复出现…

力扣SQL50 各赛事的用户注册率 分组计数 双排序字段

Problem: 1633. 各赛事的用户注册率 &#x1f468;‍&#x1f3eb; 参考题解 Code select contest_id, ROUND(COUNT(user_id) * 100 / (select count(*) from users),2) as percentage from register group by contest_id order by percentage desc, contest_id asc

vue3自动导入---组件库elements-ui,vuetify以及scss样式的自动导入

自动导入 我们在使用第三方组件库和css样式文件时&#xff0c;都需要进行引入&#xff0c;可以在单个组件内单独引用&#xff0c;也可以在全局引入或一次引入所有组件&#xff1b;但是&#xff0c;一般情况下我们都不会全部引入&#xff0c;这会是打包的结果变大&#xff0c;而…

linux挂载硬盘(解决linux不显示硬盘问题)

目录 1.查看系统有几块硬盘2.查看挂载情况3.格式化硬盘4.创建挂载目录用于挂载硬盘5.将硬盘挂载到指定的挂载目录6.随系统自启动挂载查看配置文件&#xff0c;看是否已经把这条命令加入配置 帮同门解决挂载失败问题记录 参考视频&#xff1a;只要6步&#xff01;Linux系统下挂载…

人工智能在影像组学与放射组学中的最新进展|顶刊速递·24-06-22

小罗碎碎念 本期文献速递的主题——人工智能在影像组学中的最新进展。 小罗一直以来的观点&#xff0c;是把大问题分模块拆解——既然我们想做多模态&#xff0c;那么就先了解单模态的研究套路&#xff0c;再去研究不同模态提取的特征如何融合&#xff0c;搞科研的过程也是管理…