首页 > 编程知识 正文

链表的优点,链表c++实现

时间:2023-05-06 04:24:34 阅读:31815 作者:4684

1.链表是什么

链表是对上一个元素的引用指向下一个元素的存储结构,链表通过指针连接元素和元素

链表是一种路线表,所谓的路线表包括顺序路线表和链表。 顺序线性表通过数组实现,内存有顺序数组,通过调整数组的大小来实现。 链表是用指针实现的,而不是顺序的,在存储器中是不连续的。 换句话说,链表就是将一系列不连续的内存联系起来,合理利用这些碎片化的内存来解决空间问题。

因此,在链表中,可以插入和删除位于表中任意位置的节点,但不能立即访问。 链表有多种类型:单向链表、双向链表和循环链表。

2.单向链表

单向链表包含两个域:信息域和指针域。 也就是说,单向链表中的节点分为存储或显示有关节点信息的部分、存储下一个节点地址的部分以及最后一个节点指向null值的部分。

3.双向链表

从上图中可以清楚地看到,每个节点有两个链路。 一个指向上一个节点,另一个指向空值或空值列表。 另一个指向空值或空值列表。 如果此链接是最后一个链接,则指向空值或空值列表。 这意味着双向链表有两个指针。 一个是指向上一个节点的指针,另一个是指向下一个节点的指针。

4.循环链表

循环链表是指第一个节点和最后一个节点连接在一起。 链表中第一个节点的前面是最后一个节点,反之亦然。

5. 数组和链表的区别?

区别:链表是链式存储结构。 数组是一种顺序存储结构。

链表用指针连接元素和元素,数组按顺序存储所有元素。

链表的插入删除元素相对数组较为简单,不需要移动元素,且较为容易实现长度扩充,但是寻找某个元素较为困难;

数组查找元素很容易,但插入和删除很复杂。 由于最大长度必须在重新编程开始时指定,因此扩展长度在达到最大长度时不像链表那么有用。

同样,这两种结构都可以依次保存数据,所构建的模型具有线性结构。

6.链表的应用、代码实践

约瑟夫问题:

传说在公园1世纪的犹太战争中,犹太约瑟夫是公元1世纪著名的历史学家。 罗马人占领乔塔帕特后,39名犹太人和约瑟夫及其朋友躲在洞里。 39名犹太人决定宁愿死也不被敌人俘虏,41人围成一圈从第一个开始计数,每次向第三个报告都要自杀,然后下一个人必须重新计数,直到所有人自杀身亡。 但是,约瑟夫和他的朋友不想听从这个承诺。 约瑟夫请求朋友先假装服从,然后把朋友和自己安排在第_和第_个位置,逃离了这个死亡游戏。 你知道被安排在第几个吗?

使用单向循环链表解决上述问题。

//节点类functionnode(elemnt ) {this.item=elemnt; this.next=null; //循环列表必须修改构造函数。 扫描时的判断条件//构造函数如下; 如果要从后向前遍历,但不想创建双向链表,请使用循环链表。 功能列表((this.head=new node ) '1); this.head.next=this.head; this.remove=remove; this.insert=insert; this.find=find; this.display=display//. function find (number ) {var curr=this.head; wile(curr.item!=number(curr=curr.next; }返回计数器; }functioninsert(element,newElement ) varprenode=this.find ) element ); varcurrent=newnode(newelement; current.next=preNode.next; preNode.next=current; }function remove () {var current=this.head; 控制台. log (remove ); //跳过两个,杀死一个while (current.next.next!=null current.item!=current.next.next.item ) {var temp=current.next.next; current.next.next=temp.next; current=temp.next; temp.next=null; }返回当前; }functiondisplay(flag,current ) {var crr=this.head; if (标志) while(CRR.next.item!='1' ) {console.log(CRR.item ); crr=crr.next; } }else{ //最后两个直接输出console.log(current.item ); console.log(current.next.item ); }}var Clist=new Llist (; //输入排序for (vari=1; i 41; I ) (clist.insert ) toString )、(i 1).toString ); //先输出所有clist.display(1,null ); clist.display(0,Clist.remove ) ); //16,31代码的编写方法是学习体验

7 .自我理解

1 )数组便于查询和修改,但不便于添加和删除

2 )链表适合添加和删除,但不适合查询。 根据业务情况使用合适的数据结构和算法是大数据量和并发性高时需要考虑的问题

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。