热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

java单链表和双_Java链表,单链表和双链表

Java-链表1、什么是链表?2、链表的特点是什么?3、链表的实现原理?4、如何自己写出一个链表?1、什么是链表࿱

Java-链表

1、什么是链表?

2、链表的特点是什么?

3、链表的实现原理?

4、如何自己写出一个链表?

1、什么是链表?

链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针连接次序实现的。

每一个链表都包含多个节点,节点又包含两个部分,一个是数据域(储存节点含有的信息),一个是引用域(储存下一个节点或者上一个节点的地址)。

链表的理解示意图

9b6aac6e00117f24421871600cf68a1f.png

2、链表的特点是什么?

获取数据麻烦,需要遍历查找,比数组慢

方便插入、删除

3、链表的实现原理

创建一个节点类,其中节点类包含两个部分,第一个是数据域(你到时候要往节点里面储存的信息),第二个是引用域(相当于指针,单向链表有一个指针,指向下一个节点;双向链表有两个指针,分别指向下一个和上一个节点)

创建一个链表类,其中链表类包含三个属性:头结点、尾节点和大小,方法包含添加、删除、插入等等方法。

单向链表的节点类:

1 public class Node {

2 public Object data;

3 public Node next;

4

5 public Node(Object e){

6 this.data = e;

7 }

8 }

双向链表的节点类:

1 public class Node {

2 public Object e;

3 public Node next;

4 public Node pre;

5 public Node(){

6

7 }

8 public Node(Object e){

9 this.e = e;

10 next = null;

11 pre = null;

12 }

13 }

4、如何自己写出一个链表?

代码如下(以双向链表为例,有详细的注释,单向链表同理):

首先创建了一个节点类

1 package MutuLink;

2

3 public class Node {

4 public Object e;

5 public Node next;

6 public Node pre;

7 public Node(){

8

9 }

10 public Node(Object e){

11 this.e = e;

12 next = null;

13 pre = null;

14 }

15 }

然后创建了一个链表类

1 package MutuLink;

2

3 public class MyList {

4 private Node head;

5 private Node tail;

6 private int size = 0;

7

8 public MyList() {

9 head = new Node();

10 tail = new Node();

11 head.next =null;

12 tail.pre = null;

13 }

14

15 public boolean empty() {

16 if (head.next == null)

17 return true;

18 return false;

19 }

20 //找到所找下标节点的前一个节点

21 public Node findpre(int index){

22 Node rnode = head;

23 int dex = -1;

24 while(rnode.next != null){

25 //找到了插入节点的上一个节点

26 if( dex== index - 1){

27 return rnode;

28 }

29 rnode = rnode.next;

30 dex++;

31 }

32 return null;

33 }

34 public Node findthis(int index){

35 Node rnode = head;

36 //把rnode想象为指针,dex为指向的下标,这个地方很容易错,因为当指向最后一个节点时没有判断IF就跳出循环了

37 int dex = -1;

38 while(rnode.next != null){

39 if(dex == index)

40 return rnode;

41 rnode = rnode.next;

42 dex++;

43 }

44 if(dex == size - 1){

45 return rnode;

46 }

47 // Node test = new Node(new Students("haha",1,2));

48 return null;

49 }

50

51 // 往链表末尾加入节点

52 public void add(Object e) {

53 Node node = new Node(e);

54 Node rnode = head;

55 //如果是空链表的话插入一个节点,这个节点的pre不能指向上一个节点,必须指空

56 if (this.empty()) {

57 rnode.next = node;

58 rnode.next.pre = null;

59 tail.pre = node;

60 size++;

61 } else {

62 while (rnode.next != null)

63 rnode = rnode.next;

64 rnode.next = node;

65 node.pre = rnode;

66 tail.pre = node;

67 size++;

68 }

69 }

70 //往链表的某一个标插入一个节点

71 public boolean add(int index,Object e){

72 if(index <0||index>&#61;size)

73 return false;

74 Node node &#61; new Node(e);

75 Node prenode &#61; this.findpre(index);

76 node.next &#61; prenode.next;

77 prenode.next.pre &#61; node;

78 prenode.next &#61; node;

79 node.pre &#61; prenode;

80 size&#43;&#43;;

81 return true;

82 }

83 public boolean add(int index,MyList myl){

84 if(index <0 || index >&#61; size)

85 return false;

86 Node prenode &#61; this.findpre(index);

87 // myl.tail.pre.next &#61; prenode.next;

88 // prenode.pre &#61; myl.tail.pre;

89 // tail.pre &#61; null;

90 // prenode.next &#61; myl.head.next;

91 // myl.head.next.pre &#61; prenode;

92 // head.next &#61; null;

93 myl.tail.pre.next &#61; prenode.next;

94 prenode.next.pre &#61; myl.tail.pre.pre;

95 myl.head.next.pre &#61; prenode.pre;

96 prenode.next &#61; myl.head.next;

97 myl.head &#61; null;

98 myl.tail &#61; null;

99 size&#43;&#61;myl.size;

100 return true;

101 }

102

103 public Object remove(int index){

104 Object ob&#61; this.get(index);

105 if(index <0 || index >&#61; size)

106 return null;

107 //特殊情况&#xff0c;当移除节点是最后一个节点的时候

108 //较为复杂通过画图来写代码

109 if(index &#61;&#61; size - 1){

110 Node prenode &#61; this.findpre(index);

111 this.tail.pre &#61; this.tail.pre.pre;

112 this.tail.pre.next.pre &#61; null;

113 this.tail.pre.next &#61;null;

114 size--;

115 return ob;

116 }

117 //比较复杂&#xff0c;通过画图解决

118 else{

119 Node prenode &#61; this.findpre(index);

120 prenode.next &#61; prenode.next.next;

121 prenode.next.pre.next &#61; null;

122 prenode.next.pre &#61; prenode.next.pre.pre;

123 size--;

124 return ob;

125 }

126 }

127

128

129 public Object get(int index){

130 Node thisnode &#61; this.findthis(index);

131 return thisnode.e;

132 }

133 public int size(){

134 return size;

135 }

136 }

最后测试

1 package MutuLink;

2

3 import java.util.Random;

4

5 public class manage {

6 public static void main(String[] args) {

7 String name &#61; "";

8 int credit;

9 int age;

10 int size;

11 MyList myl &#61; new MyList();

12 Random random &#61; new Random();

13 size &#61; random.nextInt(5) &#43; 1;

14 for (int i &#61; 0; i

15 credit &#61; random.nextInt(5);

16 age &#61; random.nextInt(5) &#43; 18;

17 for (int j &#61; 0; j <4; j&#43;&#43;) {

18 name &#43;&#61; (char) (random.nextInt(26) &#43; 97);

19 }

20 Students stu &#61; new Students(name, credit, age);

21 myl.add(stu);

22 name &#61; "";

23 }

24

25 System.out.println("Size of myl1 is "&#43; myl.size());

26 for(int i &#61; 0; i

27 Students stu2 &#61; (Students) myl.get(i);

28 stu2.show();

29 }

30 // //测试能否在链表末尾加入节点(成功)

31 // for(int i &#61; 0; i

32 // Students stu2 &#61; (Students) myl.get(i);

33 // stu2.show();

34 // }

35 // //测试能否通过下标加入一个节点(成功)

36 // Students stu3 &#61; new Students("cyt",5,18);

37 // myl.add(1, stu3);

38 // System.out.println("Size is "&#43; myl.size());

39 // for(int i &#61; 0; i

40 // Students stu2 &#61; (Students) myl.get(i);

41 // stu2.show();

42 // }

43

44 MyList myl2 &#61; new MyList();

45 size &#61; random.nextInt(5) &#43; 1;

46 for (int i &#61; 0; i

47 credit &#61; random.nextInt(5);

48 age &#61; random.nextInt(5) &#43; 18;

49 for (int j &#61; 0; j <4; j&#43;&#43;) {

50 name &#43;&#61; (char) (random.nextInt(26) &#43; 97);

51 }

52 Students stu2 &#61; new Students(name, credit, age);

53 myl2.add(stu2);

54 name &#61; "";

55 }

56 System.out.println("Size is of myl2 "&#43; myl2.size());

57 for(int i &#61; 0; i

58 Students stu2 &#61; (Students) myl2.get(i);

59 stu2.show();

60 }

61

62

63

64 myl.add(1, myl2);

65 System.out.println("Size is of myl1 "&#43; myl.size());

66 for(int i &#61; 0; i

67 Students stu2 &#61; (Students) myl.get(i);

68 stu2.show();

69 }

70

71

72 }

73

74 }

结果输出&#xff1a;

65aa6a93642aaa32683ab89e983842be.png



推荐阅读
  • 本文探讨了Java中char数据类型的特点,包括其表示范围以及如何处理超出16位字符限制的情况。通过引入代码点和代码单元的概念,详细解释了Java处理增补字符的方法。 ... [详细]
  • 深入理解设计模式之观察者模式
    本文详细介绍了观察者模式,这是一种行为设计模式,适用于当对象状态发生变化时,需要通知其他相关对象的场景。文中不仅解释了观察者模式的基本概念,还通过Java代码示例展示了其实现方法。 ... [详细]
  • 并发环境下的集合元素移除技巧与注意事项
    探讨在并发编程中对集合进行元素移除操作时应注意的关键点,包括使用迭代器的安全方法以及避免常见错误。 ... [详细]
  • Spring Boot 入门指南
    本文介绍了Spring Boot的基本概念及其在现代Java应用程序开发中的作用。Spring Boot旨在简化Spring应用的初始设置和开发过程,通过自动配置和约定优于配置的原则,帮助开发者快速构建基于Spring框架的应用。 ... [详细]
  • 本文介绍了一种在Java中实现自然排序的方法,通过自定义比较器来处理包含数字的字符串,确保数字部分按照数值大小进行正确排序。 ... [详细]
  • 本文探讨了在JavaScript中执行字符串形式代码的多种方法,包括使用eval()函数以及跨页面调用的方法。同时,文章详细介绍了JavaScript中字符串的各种常用方法及其应用场景。 ... [详细]
  • 本文将详细介绍NSRunLoop的工作原理,包括其基本概念、消息类型(事件源)、运行模式、生命周期管理以及嵌套运行等关键知识点,帮助开发者更好地理解和应用这一重要技术。 ... [详细]
  • 前文|功能型_品读鸿蒙HDF架构
    前文|功能型_品读鸿蒙HDF架构 ... [详细]
  • 优化JavaScript中的多条件判断逻辑
    本文探讨了在JavaScript中遇到复杂逻辑判断时,如何通过不同的方法优化if/else或switch语句,以提高代码的可读性和可维护性。 ... [详细]
  • 本文介绍了Java中使用线程池执行器(ExecutorService)来管理和调度多线程任务的方法。通过具体的代码示例,详细解释了不同类型的线程池创建方式及其应用场景。 ... [详细]
  • 本文介绍了两种在Android设备上获取MAC地址的有效方法,包括通过Wi-Fi连接和使用移动数据流量的情况。第一种方法依赖于Wi-Fi连接来获取MAC地址,而第二种方法则无需Wi-Fi,直接通过网络接口获取。 ... [详细]
  • Eclipse 下 JavaFX 程序开发指南
    本文介绍了 JavaFX,这是一个用于创建富客户端应用程序的 Java 图形和媒体工具包,并详细说明了如何在 Eclipse 环境中配置和开发 JavaFX 应用。 ... [详细]
  • 主板市盈率、市净率及股息率的自动化抓取
    本文介绍了如何通过Python脚本自动从中国指数有限公司网站抓取主板的市盈率、市净率和股息率等关键财务指标,并将这些数据存储到CSV文件中。涉及的技术包括网页解析、正则表达式以及异常处理。 ... [详细]
  • 本文将探讨从ASP.NET 1.1到2.0期间编译系统的重要变革。通过对比两个版本的即时编译模型,我们将揭示2.0版本中引入的新特性和改进之处。 ... [详细]
  • 本文介绍如何创建一个专门用于处理浮点数的JSON处理器,并将其注册到JSON配置器中,以实现对浮点数的精确控制和格式化输出。 ... [详细]
author-avatar
FEEL欧诺_625
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有