这是我写的第三个集合类了,也是简单的实现了一下基本功能,这次带来的是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. 恕我直言你可能真的不会java第2篇:Java Stream API?

    一.什么是Java Stream API? Java Stream函数式编程接口最初是在Java 8中引入的,并且与lambda一起成为Java开发的里程碑式的功能特性,它极大的方便了开放人员处理集合 ...

  2. 搞定ReentrantReadWriteLock 几道小小数学题就够了

    | 好看请赞,养成习惯 你有一个思想,我有一个思想,我们交换后,一个人就有两个思想 If you can NOT explain it simply, you do NOT understand it ...

  3. springboot_自动配置原理

    目录 1.1 @SpringBootApplication 2.1 @EnableAutoConfiguration 2.1.1 @AutoConfigurationPackage 2.1.2 @Im ...

  4. ceph集成openstack cinder

    本环境ceph已经搭建,ceph搭建麻烦见本博客的其他文章 1 在cinder-volume节点安装ceph client yum install -y ceph-common 注意:glance要安 ...

  5. python高阶-Linux基础命令集

    声明: 1)仅作为个人学习,如有冒犯,告知速删! 2)不想误导,如有错误,不吝指教! 1: 查看文件信息:ls ls常用参数: 参数 含义 -a 显示指定目录下所有子目录与文件,包括隐藏文件 -l 以 ...

  6. Spring WebFlux 01 (原理及使用场景)

    一.什么是 Spring WebFlux 好多人以为Spring WebFlux就是Spring MVC的升级版,其实不然,那到底什么是Spring WebFlux呢,首先就要搞清楚Spring We ...

  7. 《UNIX环境高级编程》(APUE) 笔记第八章 - 进程控制

    8 - 进程控制 Github 地址 1. 进程标识 每个进程都有一个非负整型表示的 唯一进程 ID .进程 ID 是可复用的(延迟复用算法). ID 为 \(0\) 的进程通常是调度进程,常常被称为 ...

  8. 猿灯塔:最详细Dubbo相关面试题!

    1.Dubbo是什么? Dubbo是阿里巴巴开源的基于 Java 的高性能 RPC 分布式服务框架,现已成为 Apache 基金会孵化项目. 面试官问你如果这个都不清楚,那下面的就没必要问了. 官网: ...

  9. 每日一题 - 剑指 Offer 50. 第一个只出现一次的字符

    题目信息 时间: 2019-07-03 题目链接:Leetcode tag:哈希表 难易程度:简单 题目描述: 在字符串 s 中找出第一个只出现一次的字符.如果没有,返回一个单空格. s 只包含小写字 ...

  10. 好看css搜索框样式_分享8款纯CSS搜索框

    最简单实用的CSS3搜索框样式,纯CSS效果无需任何javascript,其中部分搜索框在点击的时候有动画特效,搜索框的应用也是比较普通的,效果如下: 设计网站大全https://www.wode00 ...