模拟LinkedList源码

简介

Java内置的LinkedList类底层物理结构是稀疏存储,逻辑结构为链表;

链表中每个元素都包含前缀、元素内容、后缀三个部分,前、后缀分别代表前、后一个元素的地址;

具体步骤:

1、自定义Node类,代表链表中的每一个元素;

        Node类中有属性prev存储前一个元素,obj存储本身元素,next存储后一个元素;

public class Node {
    private Node prev;//上个元素是Node类
    private Object obj;//本身数据用Object类
    private Node next;//下个元素是Node类
    //这里省略get、set方法以及toString方法,自己记得加
}

2、定义好内部元素的类,我们创建MyLinkedList类;

        链表的首个元素非常重要,遍历需要从首元素开始通过next地址往下寻找,所以需要专门用一个属性保存;

        末尾元素也很重要,添加时是新增元素的prev,也要修改末尾元素的next,所以需要专门用一个属性保存;

        另外还需要一个属性记录链表长度;

public class MyLinkedList {
    private Node first;//首元素
    private Node last;//尾元素
    private int count;//链表长度

    //添加元素方法
    void add(Object obj) {
        Node node = new Node();
        if (first == null) {//如果链表目前没数据
            node.setPrev(null);//该元素前缀设为空
            node.setObj(obj);//元素内容为传入数据
            node.setNext(null);//后缀为空
            first=node;//链表首元素设为该元素
            last=node;//链表尾巴元素设为该元素
        } else {//如果链表已经有数据
            node.setPrev(last);//前缀为目前的尾元素
            node.setObj(obj);//元素内容为传入数据
            node.setNext(null);//后缀为空
            last.setNext(node);//目前的尾元素成了倒数第二,所以它的后缀改成新增元素
            last=node;//尾元素改成新增的这个
        }
        count++;//链表长度+1
    }

    //获取链表长度方法
    public int getSize(){
        return count;//直接返回记录的长度
    }

    //根据下标获取元素
    public Object get(int idx){
        Node node = first;//先找到链表首元素
        for (int i = 0; i < idx; i++) {//要获取第几个元素,就循环几次
            node = node.getNext();//循环了idx次后拿到第idx个元素,保存到node里
        }
        return node.getObj();//返回这个元素
    }

    public Node getFirst() {
        return first;
    }
    public void setFirst(Node first) {
        this.first = first;
    }
    public Node getLast() {
        return last;
    }
    public void setLast(Node last) {
        this.last = last;
    }
}

测试

class Test{
    public static void main(String[] args) {
        MyLinkedList ml = new MyLinkedList();
        ml.add("a");
        ml.add("b");
        ml.add("c");
        System.out.println(ml.getSize());
        System.out.println(ml.get(2));
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值