2.[数据结构和算法分析笔记]链

简介:

1.链表

一个链结点是某个类的对象,这个类叫做Link。每个Link对象中都包含一个对下一个链结点引用的字段(叫做next)


1
2
3
4
5
public  class  Link {
     public  int  iData;
     public  double  dData;
     public  Link next;
}


它包含了一些数据和下一个链结点的引用。

通常,用一个包含这些数据的类的对象来代替这些数据项。


1
2
3
4
public  class  Link {
     public  inventoryItem iI;
     public  Link next;
}


引用和基本类型

类型为Link的next字段仅仅是对另一个Link对象的“引用”,而不是一个对象。Link对象并没有真正包含另一个Link对象。

1
Link someLink =  new  Link();

somelink字段没有真正的一个对象,它是一个引用。

1
Link aLink = someLink;

2.单链表

1
2
3
public  class  LinkList {
     private  Link first;
}


Link first表示指向链表中的第一个链结点。

在链表头出入一个数据项

为了插入新链结点,只需要使新创建的链结点的next字段指向原来的first,然后改变first,使它指向新创建的链结点。


1
2
3
4
5
public  void  insertFirst() {
     Link newLink =  new  Link();
     newLink.next = first; // newLink > old first
     first = newLink; // first > newLink
}


在链表头删除一个数据项

通过把first指向第二个链接点,断开和第一个连接点的连接。


1
2
3
4
5
public  Link deleteFirst() {
     Link temp = first;
     first = first.next; // delete it:firts > old next
     return  temp; // return deleted link
}


遍历链表显示它的内容

从first开始,沿着引用链从一个链结点到下一个连接点。变量current按顺序指向每一个链结点。


1
2
3
4
5
6
7
public  void  display() {
     Link current = first;
     while  (current !=  null ) {
         current = current.next;
         System.out.println(current.iI);
     }
}

3.双端链表

双端链表增加了对最后一个链结点的引用。双端链表类叫做FirstLastList,它由两个项,first和last,一个指向链表中的第一个链结点,另一个指向最后一个链结点。如果链表只有一个链结点,first和last都指向它,如果没有连接点,两者都为null。

双向链表很形象个U。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public  class  FirstLastList {
     private  Link first;
     private  Link last;
     public  void  insertFirst() {
         Link newLink =  new  Link();
         if  (first ==  null )
             last = newLink;
         newLink.next = first;
         first = newLink;
     }
     public  void  insertLast() {
         Link newLink =  new  Link();
         if  (first ==  null )
             first = newLink;
         else
             last.next = newLink;
         last = newLink;
     }
}


链表的效率

在表头插入和删除速度很快快,时间复杂度O(1)。

4.有序链表

有序链表:数据是按照关键值有序排序的。

有序链表优于有序数组的地方是插入速度(因为元素不需要移动),另外链表可以扩展到全部有效地使用内存。

有序链表是优先级队列和堆的常用实现方法。

在有序链表中插入一个数据项

为了在一个有序链表中插入数据项,算法必须首先搜索链表,找到合适的位置:它恰好在第一个比它大的数据想的前面。


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public  class  SortedList {
     private  Link first;
     public  void  insert( long  key) {
         Link newLink =  new  Link();
         Link previous =  null ;
         Link current = first;
         while  (current !=  null  && key > current.dData) {
             previous = current;
             current = current.next;
         }
         if  (previous ==  null )
             first = newLink;
         else
             previous.next = current;
     }
}


有序链表的效率

在有序链表插入和删除某一项最多需要O(N)次比较。

5.双向链表

双向链表即允许向前遍历,也允许向后遍历整个链表。每个链结点都有两个指向其他连接点的引用,一个指向下一个链结点,另一个指向前一个链结点。


1
2
3
4
5
public  class  Link {
     public  double  dData;
     public  Link next;
     public  Link previous;
}


双向链表的缺点是每次插入或删除一个链结点的时候,都要处理四个链结点的引用。双向链表不必是双端链表。


1
2
3
4
class  doublyLinked {
     private  Link first;
     private  Link last;
}


Link first表示指向链表中的第一个链结点。对first的操作就是对链表第一个连接点的操作,因为他们都指向同一个对象。

Link last表示指向链表中的最后一个链结点。

插入

1
2
3
4
5
6
7
8
9
public  void  insertFirst() {
     Link newLink =  new  Link();
     if (first ==  null )
         last = newLink;
     else
         first.previous = newLink;
     newLink.next = first;
     first = newLink;
}


insertFirst方法把原来first指向的链结点的previous字段指向新链结点,并把新链结点的next字段指向前者。最后把first指向新连接点。


1
2
3
4
5
6
7
8
9
10
public  void  insertLast() {
     Link newLink =  new  Link();
     if (first ==  null )
         first = newLink;
     else  {
         last.next = newLink;
         newLink.previous = last;
     }
     last = newLink;
}



删除


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public  Link deleteFirst() {
         Link temp = first;
         if (first.next ==  null )
             last =  null ;
         else
             first.next.previous =  null ;
         first = first.next;
         return  temp;
     }
       
     public  Link deleteLast() {
         Link temp = last;
         if (first.next ==  null )
             first =  null ;
         else
             last.previous.next =  null ;
         last = last.previous;
         return  temp;
}









本文转自 LinkedKeeper 51CTO博客,原文链接:http://blog.51cto.com/sauron/1225186,如需转载请自行联系原作者
目录
相关文章
|
数据采集 机器学习/深度学习 算法
别急着上算法,咱先把数据整明白:大数据分析的5个基本步骤,你都搞对了吗?
别急着上算法,咱先把数据整明白:大数据分析的5个基本步骤,你都搞对了吗?
1055 4
|
机器学习/深度学习 边缘计算 算法
NOMA和OFDMA优化算法分析
NOMA和OFDMA优化算法分析
616 127
|
11月前
|
运维 监控 JavaScript
基于 Node.js 图结构的局域网设备拓扑分析算法在局域网内监控软件中的应用研究
本文探讨图结构在局域网监控系统中的应用,通过Node.js实现设备拓扑建模、路径分析与故障定位,提升网络可视化、可追溯性与运维效率,结合模拟实验验证其高效性与准确性。
546 3
|
11月前
|
存储 边缘计算 算法
【太阳能学报EI复现】基于粒子群优化算法的风-水电联合优化运行分析(Matlab代码实现)
【太阳能学报EI复现】基于粒子群优化算法的风-水电联合优化运行分析(Matlab代码实现)
203 0
|
编解码 算法 5G
MIMO雷达空间谱估计中Capon算法与MUSIC算法的对比分析及实现
MIMO雷达空间谱估计中Capon算法与MUSIC算法的对比分析及实现
1077 2
|
存储 监控 安全
企业上网监控系统中红黑树数据结构的 Python 算法实现与应用研究
企业上网监控系统需高效处理海量数据,传统数据结构存在性能瓶颈。红黑树通过自平衡机制,确保查找、插入、删除操作的时间复杂度稳定在 O(log n),适用于网络记录存储、设备信息维护及安全事件排序等场景。本文分析红黑树的理论基础、应用场景及 Python 实现,并探讨其在企业监控系统中的实践价值,提升系统性能与稳定性。
793 1
|
人工智能 自然语言处理 算法
2025 年 7 月境内深度合成服务算法备案情况分析报告
2025年7月,中央网信办发布第十二批深度合成算法备案信息,全国389款产品通过备案,服务提供者占比超七成。截至7月14日,全国累计备案达3834款,覆盖文本、图像、音视频等多模态场景,广泛应用于生活服务、医疗、金融等领域。广东以135款居首,数字人、AI客服等C端应用主导,民营企业成主力,国企聚焦公共服务。随着AI政策推动,备案已成为AI产品合规上线关键环节。
|
12月前
|
机器学习/深度学习 算法 5G
【MUSIC、最大似然与克拉美-罗下界】MUSIC与ESPRIT 算法来估计到达角(AoA),并尝试推导克拉美-罗下界(CRLB)以分析其性能研究(Matlab代码实现)
【MUSIC、最大似然与克拉美-罗下界】MUSIC与ESPRIT 算法来估计到达角(AoA),并尝试推导克拉美-罗下界(CRLB)以分析其性能研究(Matlab代码实现)
787 0
|
存储 监控 算法
基于跳表数据结构的企业局域网监控异常连接实时检测 C++ 算法研究
跳表(Skip List)是一种基于概率的数据结构,适用于企业局域网监控中海量连接记录的高效处理。其通过多层索引机制实现快速查找、插入和删除操作,时间复杂度为 $O(\log n)$,优于链表和平衡树。跳表在异常连接识别、黑名单管理和历史记录溯源等场景中表现出色,具备实现简单、支持范围查询等优势,是企业网络监控中动态数据管理的理想选择。
314 0
|
存储 算法 Java
算法系列之数据结构-二叉树
树是一种重要的非线性数据结构,广泛应用于各种算法和应用中。本文介绍了树的基本概念、常见类型(如二叉树、满二叉树、完全二叉树、平衡二叉树、B树等)及其在Java中的实现。通过递归方法实现了二叉树的前序、中序、后序和层次遍历,并展示了具体的代码示例和运行结果。掌握树结构有助于提高编程能力,优化算法设计。
540 10
 算法系列之数据结构-二叉树

热门文章

最新文章