这是我写的第三个集合类了,也是简单的实现了一下基本功能,这次带来的是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的更多相关文章

  1. 利用SpringBoot+Logback手写一个简单的链路追踪

    目录 一.实现原理 二.代码实战 三.测试 最近线上排查问题时候,发现请求太多导致日志错综复杂,没办法把用户在一次或多次请求的日志关联在一起,所以就利用SpringBoot+Logback手写了一个简 ...

  2. 手写一个简单的ElasticSearch SQL转换器(一)

    一.前言 之前有个需求,是使ElasticSearch支持使用SQL进行简单查询,较新版本的ES已经支持该特性(不过貌似还是实验性质的?) ,而且git上也有elasticsearch-sql 插件, ...

  3. 手写一个简单的starter组件

    spring-boot中有很多第三方包,都封装成starter组件,在maven中引用后,启动springBoot项目时会自动装配到spring ioc容器中. 思考: 为什么我们springBoot ...

  4. 手写一个简单的HashMap

    HashMap简介 HashMap是Java中一中非常常用的数据结构,也基本是面试中的"必考题".它实现了基于"K-V"形式的键值对的高效存取.JDK1.7之前 ...

  5. 手写一个简单到SpirngMVC框架

    spring对于java程序员来说,无疑就是吃饭到筷子.在每次编程工作到时候,我们几乎都离不开它,相信无论过去,还是现在或是未来到一段时间,它仍会扮演着重要到角色.自己对spring有一定的自我见解, ...

  6. jquery 手写一个简单浮窗的反面教材

    前言 初学jquery写的代码,陈年往事回忆一下. 正文 介绍一下大体思路 思路: 1.需要控制一块区域,这块区域一开始是隐藏的. 2.这个区域需要关闭按钮,同时我需要写绑定事件,关闭的时候让这块区域 ...

  7. 手写一个简单版的SpringMVC

    一 写在前面 这是自己实现一个简单的具有SpringMVC功能的小Demo,主要实现效果是; 自己定义的实现效果是通过浏览器地址传一个name参数,打印“my name is”+name参数.不使用S ...

  8. socket手写一个简单的web服务端

    直接进入正题吧,下面的代码都是我在pycharm中写好,再粘贴上来的 import socket server = socket.socket() server.bind(('127.0.0.1', ...

  9. 自己写一个简单的LinkedList

    单链表 推荐阅读:https://www.cnblogs.com/zwtblog/tag/源码/ 哨兵节点: 哨兵节点在树和链表中被广泛用作伪头.伪尾等,通常不保存任何数据. 我们将使用伪头来简化我们 ...

随机推荐

  1. windows server2012 安装SQL SERVER 2016环境监测出错

    Windows Server 2012 R2 安装SQL Server 2016 顺序为:KB2919442 ——> KB2919355 ——> SQL Server 2016 并且还要安 ...

  2. Android学习笔记上下文菜单

    布局文件main_activity.xml <?xml version="1.0" encoding="utf-8"?> <RelativeL ...

  3. 网站用https访问的问题

    网站挂到阿里云上, 可以http访问, 也可以https访问. 但是如果用https方式访问网站.发现接口报错. 因为接口只提供http方式. 在谷歌浏览器出现: Mixed Content: The ...

  4. ca12a_c++顺序容器的操作5_访问容器中的数据元素

    ca12a_c++顺序容器的操作5_访问容器中的数据元素访问元素:c.back()..显示最后一个数据c.front() ..显示第一个数据c[n],n就是下标,适合vector与dequec.at( ...

  5. 6.kubernetes的GUI资源管理插件-dashboard

    目录 1.准备dashboard镜像 2.创建资源配置清单 3.应用资源配置清单 4.查看创建的资源 5.解析域名 6.浏览器访问 7.令牌命令行获取方式 准备dashboard镜像 [root@hd ...

  6. Java学习笔记6(集合类)

    集合类 集合按照其存储结构可以分为两大类,即单列集合Collection和双列集合Map. Collection:单列集合类的根接口,用于存储一系列符合某种规则的元素,有List和Set两个重要子接口 ...

  7. JAVA设计模式 3【创建型】理解工厂模式与抽象工厂模式

    上一节我们已经学习了原型模式,稍微复习一下:通过重写Object 类的clone() 方法实现浅克隆,浅克隆也要实现Cloneable 标记接口.而深克隆则是将对象通过序列化和反序列化 的方式进行创建 ...

  8. Java wait 和 sleep 的区别

    一.区别 sleep 来自 Thread 类,和 wait 来自 Object 类 sleep 方法没有释放锁,而wait方法释放了锁,使得其他线程可以使用同步控制块或方法 wait,notify和 ...

  9. 【neo4j】文件管理路径、数据备份、创建新数据库、导入数据等操作记录

    neo4j一般的配置路径如下 一.备份数据 使用neo4j-admin命令. 首先,先找到数据的存储路径,然后关闭数据库. 关闭数据库的语句如下: #切换到/bin目录下 ./neo4j stop 然 ...

  10. ShellExecute指定IE浏览器打开网页

    ShellExecute(NULL,L"open", L"iexplore.exe", L"www.baidu.com", NULL, SW ...