热门标签 | 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容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 本文详细介绍了Java中vector的使用方法和相关知识,包括vector类的功能、构造方法和使用注意事项。通过使用vector类,可以方便地实现动态数组的功能,并且可以随意插入不同类型的对象,进行查找、插入和删除操作。这篇文章对于需要频繁进行查找、插入和删除操作的情况下,使用vector类是一个很好的选择。 ... [详细]
  • 本文介绍了使用Java实现大数乘法的分治算法,包括输入数据的处理、普通大数乘法的结果和Karatsuba大数乘法的结果。通过改变long类型可以适应不同范围的大数乘法计算。 ... [详细]
  • 本文介绍了一个Java猜拳小游戏的代码,通过使用Scanner类获取用户输入的拳的数字,并随机生成计算机的拳,然后判断胜负。该游戏可以选择剪刀、石头、布三种拳,通过比较两者的拳来决定胜负。 ... [详细]
  • 本文介绍了如何在给定的有序字符序列中插入新字符,并保持序列的有序性。通过示例代码演示了插入过程,以及插入后的字符序列。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • Java太阳系小游戏分析和源码详解
    本文介绍了一个基于Java的太阳系小游戏的分析和源码详解。通过对面向对象的知识的学习和实践,作者实现了太阳系各行星绕太阳转的效果。文章详细介绍了游戏的设计思路和源码结构,包括工具类、常量、图片加载、面板等。通过这个小游戏的制作,读者可以巩固和应用所学的知识,如类的继承、方法的重载与重写、多态和封装等。 ... [详细]
  • 本文讨论了如何优化解决hdu 1003 java题目的动态规划方法,通过分析加法规则和最大和的性质,提出了一种优化的思路。具体方法是,当从1加到n为负时,即sum(1,n)sum(n,s),可以继续加法计算。同时,还考虑了两种特殊情况:都是负数的情况和有0的情况。最后,通过使用Scanner类来获取输入数据。 ... [详细]
  • 本文介绍了在Java中gt、gtgt、gtgtgt和lt之间的区别。通过解释符号的含义和使用例子,帮助读者理解这些符号在二进制表示和移位操作中的作用。同时,文章还提到了负数的补码表示和移位操作的限制。 ... [详细]
  • JavaSE笔试题-接口、抽象类、多态等问题解答
    本文解答了JavaSE笔试题中关于接口、抽象类、多态等问题。包括Math类的取整数方法、接口是否可继承、抽象类是否可实现接口、抽象类是否可继承具体类、抽象类中是否可以有静态main方法等问题。同时介绍了面向对象的特征,以及Java中实现多态的机制。 ... [详细]
  • 本文介绍了Java高并发程序设计中线程安全的概念与synchronized关键字的使用。通过一个计数器的例子,演示了多线程同时对变量进行累加操作时可能出现的问题。最终值会小于预期的原因是因为两个线程同时对变量进行写入时,其中一个线程的结果会覆盖另一个线程的结果。为了解决这个问题,可以使用synchronized关键字来保证线程安全。 ... [详细]
  • 从零学Java(10)之方法详解,喷打野你真的没我6!
    本文介绍了从零学Java系列中的第10篇文章,详解了Java中的方法。同时讨论了打野过程中喷打野的影响,以及金色打野刀对经济的增加和线上队友经济的影响。指出喷打野会导致线上经济的消减和影响队伍的团结。 ... [详细]
  • 1,关于死锁的理解死锁,我们可以简单的理解为是两个线程同时使用同一资源,两个线程又得不到相应的资源而造成永无相互等待的情况。 2,模拟死锁背景介绍:我们创建一个朋友 ... [详细]
  • 个人学习使用:谨慎参考1Client类importcom.thoughtworks.gauge.Step;importcom.thoughtworks.gauge.T ... [详细]
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社区 版权所有