初识链表

链表(Linked list)是一种常见的基础数据结构,是一种线性表,但是并不会按线性的链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。链表由一系列结点(链表中每一个元素称为结点)组成,结点可以在运行时动态生成。每个结点包括两个部分:一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域。 相比于线性表顺序结构,操作复杂。由于不必须按顺序存储,链表在插入的时候可以达到O(1)的复杂度,比另一种线性表顺序表快得多,但是查找一个节点或者访问特定编号的节点则需要O(n)的时间,而线性表和顺序表相应的时间复杂度分别是O(logn)和O(1)。
链表的构建:
构建内部类:

private class Note{
    public E e;
    public Note next;
}

第一步:创建节点对象

Note first =new Note();
Note second=new second();
Note third =new Third();

第二步:对数据e和对象的引用next赋值

first.e="a";//假设此时泛型E为字符串String类型
second.e="b";
third.e="c";
//将链表串联起来
first.next=second;
second.next=third;
third.next=null;//此时为最后一个元素,默认初始值为null

链表的构建过程
向链表中添加元素(表头、表中、表尾)
1.向表头添加元素
主要思想:首先新建一个节点(Note)对象newNote,将first节点暂时赋给newNote,并将newNote的对象引用指向first,最后将fist赋值给newNote。实现代码如下:

Note newNote=new Note(e);
newNote.next=first;
newNote=first;

2.向表中添加元素
主要思想:首相创建一个新的节点对象(newNote),获取到需要插入的对应位置的前一个节点prev和prev所指向的下一个节点对象prev.next,将newNote.next指向prev.next,prev.next指向newNote。代码实现如下:

Note newNote=new Note(e);
newNote.next=prev.next;
prev.next=newNote;

3.向表尾添加元素
主要思想:同理创建一个新的节点对象newNote,将原先的最后一个节点third暂时赋给newNote,并将third.next指向newNote,最后将third赋值给newNote(这里third也可以改为last,表示链表的最后一个节点),代码实现如下:

Note newNote=new Note(e);
third.next=newNote;
newNote=third;

链表具体底层实现如下:

    public class LinkedList<E>{
        private class Note{
            public E e;
            public Note next;
        public Note(E e,Note next){
            this.e=e;
            this.next=next;

        }
        public Note(E e){
            this(e,null);
        }
        public Note(){
            this(null,null);
        }
        public String toString(){
            return e.toString;
        }
        }
        private Note heard;
        public int size;
        public LinkedList(){
            heard=null;
            size=0;
        }
        public int getSize(){
            return size;
        }
        public boolean isEmpty(){
            return size==0;//或者note.next==null
        }
        //在表头添加元素
        public void addFirst(E e){
            Note note=new Note(e);
            note.next=heard;
            note=heard;
            size++
        }
        //在链表的任意位置添加元素
        public void add(int index,E e){
            if(index<0||index>size){
                throw new IllegalArgumentException("添加失败,不合法!");
            }
            if(index==0){
                addFirst(e);
                size++;
            }
            else{
                Note prev=heard;
                for(int i=0;i<index-1;i++){
                    prev=prev.next;
                }
                Note note=new Note(e);
                note.next=prev.next;
                prev.next=note;
                size++;
            }
        }
        //在链表末尾添加元素
        public addLast(E e){
            add(size,e);
            size++;
        }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值