如何手写一个简单的LinkedList
这是我写的第三个集合类了,也是简单的实现了一下基本功能,这次带来的是LinkedList的写法,需要注意的内容有以下几点:
1.LinkedList是由链表构成的,链表的核心即使data,前驱,后继
2.对于LinkedList不需要扩容操作,因此相对较为简单,但是在处理前驱,后继的时候需要注意一下
3.对于索引下标需要判断是否合法
4.对于一些头节点,尾节点的操作,需要注意判断,比如remove的时候,如果是删除头,中间,尾,方式都是不一样的
接下来来看代码,我的MyList接口:
public interface MyList {
    // 求容量
    int size();
    // 是否为空
    boolean isEmpty();
    // 判断是否存在
    boolean contains(Object o);
    // 清空集合
    void clear();
    // 返回添加是否成功
    boolean add(Object object);
    // 返回删除是否成功
    boolean remove(int index);
    // 获取索引位置的值
    Object get(int index);
}MyLinkedList实现类:
/**
 * @author kxm
 * @date 2018/9/17
 */
public class MyLinkedList implements MyList {
    // 定义链表类,属性有,值,前驱,后驱
    class Node{
        Object obj;
        Node previous;
        Node next;
        public void setObj(Object obj) {
            this.obj = obj;
        }
        public void setPrevious(Node previous) {
            this.previous = previous;
        }
        public void setNext(Node next) {
            this.next = next;
        }
        public Node(Object obj, Node previous, Node next) {
            this.obj = obj;
            this.previous = previous;
            this.next = next;
        }
        public Node(){
        }
    }
    // LinkedList相应属性
    private Node first = null;
    private Node last = null;
    private int size = 0;
    // 返回集合长度
    @Override
    public int size() {
        return size;
    }
    // 返回集合是否为空
    @Override
    public boolean isEmpty() {
        return size == 0;
    }
    @Override
    public boolean contains(Object o) {
        for(int i = 0;i < size; i++){
            if(first != null){
                o.equals(first.next.obj);
                return true;
            }
        }
        return false;
    }
    @Override
    public void clear() {
        first.next = null;
        first.previous = null;
        last.next = null;
        last.previous = null;
        first.obj = null;
        last.obj = null;
        size = 0;
    }
    @Override
    public boolean add(Object object) {
        /*
         * 核心点!
         * 1.要对头结点判断是否为空,空的话将制定对象置为头结点
         * 2.重点:要将last置为结点
         * 3.size++
         */
        Node n = new Node();
        if(first == null){
            n.setPrevious(null);
            n.setObj(object);
            n.setNext(null);
            first = n;
            last = n;
        }else{
            n.setPrevious(last);
            n.setObj(object);
            n.setNext(null);
            last.setNext(n);
            last = n;
        }
        size++;
        return true;
    }
    /*
     * 要移除结点temp,先将temp的后继的前驱指向temp的前驱
     * 再将temp的前驱的后继指向temp的后继
     *
     * 重点,对于头和尾需要单独判断,不然会出现空指针异常
     */
    @Override
    public boolean remove(int index) {
        Node temp = node(index);
        if(temp==first || temp==last){
            if(temp == first){
                temp.next.previous = null;
                first = temp.next;
            }else if(temp == last){
                temp.previous.next = null;
                last = temp.previous;
            }
        }else{
            temp.next.previous = temp.previous;
            temp.previous.next = temp.next;
        }
        size--;
        return true;
    }
    // 通过链表遍历的方法实现get
    @Override
    public Object get(int index) {
        rangeCheck(index);
        Node temp = node(index);
        return temp.obj;
    }
    // 实现结点的遍历
    public Node node(int index){
        Node temp = null;
        if(first != null){
            temp = first;
        }
        for (int i = 0; i < index; i++) {
            temp = temp.next;
        }
        return temp;
    }
    // 对索引下标进行合法性检查
    private void rangeCheck(int index){
        if(index < 0||index >= size){
            try {
                throw new Exception();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
}测试代码截图:
如何手写一个简单的LinkedList的更多相关文章
- 利用SpringBoot+Logback手写一个简单的链路追踪
		目录 一.实现原理 二.代码实战 三.测试 最近线上排查问题时候,发现请求太多导致日志错综复杂,没办法把用户在一次或多次请求的日志关联在一起,所以就利用SpringBoot+Logback手写了一个简 ... 
- 手写一个简单的ElasticSearch SQL转换器(一)
		一.前言 之前有个需求,是使ElasticSearch支持使用SQL进行简单查询,较新版本的ES已经支持该特性(不过貌似还是实验性质的?) ,而且git上也有elasticsearch-sql 插件, ... 
- 手写一个简单的starter组件
		spring-boot中有很多第三方包,都封装成starter组件,在maven中引用后,启动springBoot项目时会自动装配到spring ioc容器中. 思考: 为什么我们springBoot ... 
- 手写一个简单的HashMap
		HashMap简介 HashMap是Java中一中非常常用的数据结构,也基本是面试中的"必考题".它实现了基于"K-V"形式的键值对的高效存取.JDK1.7之前 ... 
- 手写一个简单到SpirngMVC框架
		spring对于java程序员来说,无疑就是吃饭到筷子.在每次编程工作到时候,我们几乎都离不开它,相信无论过去,还是现在或是未来到一段时间,它仍会扮演着重要到角色.自己对spring有一定的自我见解, ... 
- jquery 手写一个简单浮窗的反面教材
		前言 初学jquery写的代码,陈年往事回忆一下. 正文 介绍一下大体思路 思路: 1.需要控制一块区域,这块区域一开始是隐藏的. 2.这个区域需要关闭按钮,同时我需要写绑定事件,关闭的时候让这块区域 ... 
- 手写一个简单版的SpringMVC
		一 写在前面 这是自己实现一个简单的具有SpringMVC功能的小Demo,主要实现效果是; 自己定义的实现效果是通过浏览器地址传一个name参数,打印“my name is”+name参数.不使用S ... 
- socket手写一个简单的web服务端
		直接进入正题吧,下面的代码都是我在pycharm中写好,再粘贴上来的 import socket server = socket.socket() server.bind(('127.0.0.1', ... 
- 自己写一个简单的LinkedList
		单链表 推荐阅读:https://www.cnblogs.com/zwtblog/tag/源码/ 哨兵节点: 哨兵节点在树和链表中被广泛用作伪头.伪尾等,通常不保存任何数据. 我们将使用伪头来简化我们 ... 
随机推荐
- vim中的替换操作
			在vim中 :s(substitute)命令用于查找并替换字符串.使用方法如下: :s/<find-this>/<replace-with-this>/<flags> ... 
- [源码解析] GroupReduce,GroupCombine 和 Flink SQL group by
			[源码解析] GroupReduce,GroupCombine和Flink SQL group by 目录 [源码解析] GroupReduce,GroupCombine和Flink SQL grou ... 
- 为什么启动线程是start方法?
			为什么启动线程是start方法 十年可见春去秋来,百年可证生老病死,千年可叹王朝更替,万年可见斗转星移. 凡人如果用一天的视野,去窥探百万年的天地,是否就如同井底之蛙? 背景:启动线程是start ... 
- 06 . Jenkins分布式构建和Pipline
			Pipline简介 pipline 是帮助 Jenkins 实现 CI 到 CD 转变的重要角色,是运行在 jenkins 2.X 版本的核心插件,简单来 说 Pipline 就是一套运行于 Jenk ... 
- 区间dp 能量项链 洛谷p1063
			题目大意:如果前一颗能量珠的头标记为m,尾标记为r,后一颗能量珠的头标记为r,尾标记为n,则聚合后释放的能量为 (Mars单位),新产生的珠子的头标记为m,尾标记为n. 需要时,Mars人就用吸盘夹住 ... 
- JDK8--06:Stream流
			一.描述 Stream流提供了筛选与切片.映射.排序.匹配与查找.归约.收集等功能 筛选与切片: filter:接收lambda,从流中排除某些元素 limit(n):截断流,使其元素不超过n ski ... 
- 自定义Springboot全局异常类
			一.简要说明 如何实现网上文章基本是随便一搜就可以很快找到, 这里不再赘述. 二.Spring-web和Spring-webmvc 通过idea查看到两个注解位于 spring-web-5.2.2.R ... 
- 【WPF】DataGrid多表头的样式设计
			需求 在使用WPF开发时,使用DataGrid列表显示数据时,有些字段可以进行分组显示,用于更好的表达它们之间存在的某种关系,因此就考虑到要对DataGrid的表头进行扩展,可以显示多行表头,让这些有 ... 
- dart快速入门教程 (4)
			4.流程控制 4.1.分支结构 1.if语句 void main() { int score = 80; if (score >= 90) { print('优秀'); } else if (s ... 
- webpack入门进阶(1)
			1.webpack应用实例 1.1.快速上手 初始化项目 mkdir webpack-demo cd webpack-demo npm init -y 安装webpack npm i webpack@ ... 
