手写集合框架LinkedList准备篇

Hello,我我我我林GG...我又回来了,短暂的假期~呼舒服(一次性看三部电影..一觉睡到中午
的感jio太....爽了),好勒,回到正题吧,请看下文。  

自序:很多人看到这种名词就打退堂鼓的,就跟二叉树、B树一样,我一开始也是这样的,nimd,听起来真的高大尚(沃特???这是NM啥玩意),它们都是一种数据结构,其实并不难理解,千万不要被一个个名字所吓住,要知道都是人思考而来的东西,你怕个扥啊怕。

一、 理解Node节点以及单双向链表

我们先说一下单双向链表把:

1.啥是链表?

答:你戴过项链没有?骑过自行车没有(单车链)?链表也就好比我们生活中的链条一样,一个数据接一个数据的串联起来 具体请看下图:


单向链表:


图画的丑了一点,双向链表咱就不画了,就是多了一个向下指向的。
不过在这里我要解释一下我为什么将每个数据画成以下这种形式的

我这样画是因为等下这样会有助于我们理解Node这个类,因为我们在Node这个类中将会有一个当前对象,以及指向上一个对象、下一个对象的三个属性。

2.设计Node类

创建Node类,别问为什么,因为我们LinkedList里面就是这样干的,有一个Node类,然后整个链表也是围绕它而来的。

public class newNode {
    Object object;  //存储当前元素  
    public newNode Next;   //指针 指向下一个  
    public newNode prev;  //指针 指向上一个   
    public newNode() { //默认的构造器 
        
    }
    public newNode(Object object) {  //添加一个object的构造函数
        this.object = object; 
    }
    public newNode(Object object,newNode next) {  //添加一个构造器  并有一个向下的指向 
        this.object  = object;  
        this.Next = next;
    }
}

这三个属性联系我上面这张图就很简单了,我解释一下为啥Next和prev是它本类newNode的这个数据类型,比如说我到时候要通过Next拿到下一个数据对象怎么拿,所以我们只能通过这个类拿。

3.测试Node类加强理解
public static void main(String[] args) {
    newNode node1 = new newNode("数据对象1");   //创建数据对象1  没有上下指向
    System.out.println(node1.toString());
}

*输出结果:数据对象1
现在我们就要用到我们的Next和prev属性,我这里就只演示单向的,用到Next属性,这个理解了,其他的顺其自然懂了。

public static void main(String[] args) {
    newNode node1 = new newNode("数据对象1");   //创建数据对象1  向下执行node2
    newNode node2 = new newNode("数据对象2");   // 创建我们的数据对象2 
    node1.Next = node2;   // node1的向下指向为node2  
    /*
    如果是双向的 则node2的prev指向 node1   
    即:node2.prev = node1;
    */
    System.out.println(node1.Next.toString());
}

*输出结果:数据对象2
这个时候就有问题了:如果我在node1和node2之间插入一个node3 该如何办 ?

public static void main(String[] args) {
    newNode node1 = new newNode("数据对象1");   //创建数据对象1  向下执行node2
    newNode node2 = new newNode("数据对象2");   // 创建我们的数据对象2 
    newNode node3 = new newNode("数据对象3");   // 创建我们的数据对象3
    node1.Next = node3; 
    node3.Next = node2; 
    System.out.println(node1.Next.toString());
}

*输出结果:数据对象3
是不是很简单,调动位置就行了,修改node1的指向为node3node3再向下指向node2

内容不多,但是篇幅较长,代码较多,也是为了能够更好的理解我们的链表结构,不难把,那么链表以及我们到时候写LinkedList要用到的Node类就告一段落了。

二、 过程中可能会不熟悉的代码

这里也是我之前不太能理解的代码,在这里分享一下。

1. transient关键字

如果被这个关键字修饰的属性,那么在序列化的过程中,这个属性将不参与序列化的过程,并且结果会是null

2. 泛型 <? extends E>

这样定义泛型是不是不太容易理解,关于其中的?的理解,?就是我们泛型中的通配符,通配符是啥?也就是可以代表任意的符号比如字符、数字。其实这个我在之前看一本书的时候看过,所以在此附上《Effective Java(中文版第3版)》,可以去“java1234“这个网站搜索下载,里面有一章节就是专门讲泛型的。
<? extends E> 这句代码所代表的的是 “用来限制元素的类型的上限” 举个例子
<? extends Animals> 就是类型的上限为Animals,不能是它的父类,只能是他下面的子类和本身。 举一反三,相反的还有我们的这个<? super Animals>就是类型的下限了,也就是我们的类型最低是我们的Animasl及它的父类

  • 人山人海你我相遇,感恩缘分。
  • WeChat:lljb1218

猜你喜欢

转载自www.cnblogs.com/linjiab/p/12041770.html
今日推荐