结合JDK看链表实现

一、概念

链表是一种线性数据结构,由节点对象构成,节点包含链表存储的数据以及指向其他节点的链接。

<假装这里有一张链表的图片>

1.1、节点

1.1.1、属性

1.1.1.1、数据元素

根据需要定义,这里使用的是范型。

1.1.1.2、链接

对于单向链表,一般把链接的指针字段称为next。

1.1.2、构造函数

构造函数定义了两个形参,一个表示节点要存储的数据,另一个是指向下一个节点的链接。

1.1.3、其他

在链表的实现中,节点一般定义为内部类,至于为什么,我想可能是不同数据结构的节点定义会不同,放到外面就太多了,并且使用者关注的是数据结构的应用,可以不知道节点的定义。

1.2、链表

1.2.1、属性

1.2.1.1、链表大小

集合的大小一般定义为size,size作为集合的重要属性,在很多地方会使用,初始化的时候大小为0,随着集合元素数量变化而变化.

1.2.1.2、哨兵

有时候为了避免复杂重复的判空及头尾节点判断,会给链表增加哨兵。

比如在新增的时候,如果没有哨兵就要判断链表是否为空,如果原链表为空,直接新增节点作为头节点;

如果原链表不为空,还要判断插入位置是否在头部...等等,判断很是复杂,

如果有哨兵节点,只要找到preNode就可以了,将preNode原来的next链接到新节点后,将新节点链接到preNode后。

1.2.2、方法

1.2.2.0、Index检测

链表中有很多地方需要检测index,所以对这个方法做单独封装。

1.2.2.1、新增

对于有哨兵的链表,新增节点是先获取preNode,然后将新节点链接到preNode的next。

一般会创建几个新增方法:addFirst(E e)、addLast(E e)、add(int index, E e)

1.2.2.2、删除

对于有哨兵的链表,节点是先获取preNode,然后将下下个节点链接到preNode的next。

一般会创建几个删除方法:removeFirst()、removeLast()、remove(int index)

1.2.2.3、查找

从链表头逐个查找。

一般会创建几个查找方法:getFirst()、getLast()、get(int index)

1.2.2.4、遍历

链表作为一种集合一般会实现Iterable接口,待完善。

1.3、双向链表

1.3.1、双向链表节点

对比单向链表,在节点的属性中多了一个指向上一个节点的链接,另外构造函数也要加上上一个节点。

    private static class Node<E> {
        E item;
        Node<E> next;
        Node<E> prev;

        Node(Node<E> prev, E element, Node<E> next) {
            this.item = element;
            this.next = next;
            this.prev = prev;
        }
    }

1.3.2、双向链表

 

posted @ 2021-10-10 12:37  has900104  阅读(82)  评论(0)    收藏  举报