这是我写的第三个集合类了,也是简单的实现了一下基本功能,这次带来的是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. android中获取其他应用的SharedPreferences

    在android中获取其他应用的SharedPreferences,需要其他应用设置的Mode为MODE_WORLD_READABLE或者MODE_WORLD_WRITABLE两种模式.要获取其他应用 ...

  2. 几款一元单片机对比:CMS8S5880、STM8S003、N76E003

    大概17年开始,STM8S003的价格被贸易商炒货,变得很不稳定,一度上涨到2~3元,因为市场需求大增,小家电.无线充和一些简单功能的产品,本人就有在空气净化器.433M触摸开关.数据收发模块.红外控 ...

  3. 四分位数与pandas中的quantile函数

    四分位数与pandas中的quantile函数 1.分位数概念 统计学上的有分位数这个概念,一般用p来表示.原则上p是可以取0到1之间的任意值的.但是有一个四分位数是p分位数中较为有名的. 所谓四分位 ...

  4. 15.DRF-分页

    Django rest framework(6)----分页 第一种分页 PageNumberPagination 基本使用 (1)urls.py urlpatterns = [ re_path('( ...

  5. Struts2 自定义拦截器时Action无法接收到参数

    问题:自定义拦截器,没有添加defaultStack导致Action无法接受到参数 解决办法: 方法一,添加defaultStack,然后在Action中引用 自定义的stack,其实defaultS ...

  6. php计算两个时间段内的 工作日 工作小时

    <?php class WorkTime { // 定义工作日 [1, 2, 3, 4, 5, 6, 0] public $week_workingday = [1, 2, 3, 4, 5]; ...

  7. springboot_自动配置原理

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

  8. 02【熟悉】springboot和微服务的介绍

    1,springboot简介 Spring Boot 是由 Pivotal 团队提供的全新框架,其设计目的是用来简化新 Spring 应用的初始搭建以及开发过程. 该框架使用了特定的方式来进行配置,从 ...

  9. ORACLE误删除表数据或误更新/插入数据如何恢复

    工作中一不小心将本不该删除/更新/插入的数据进行删除/更新/插入了,这时候一定要尽快进行恢复. 工具/原料   PL/SQL 方法/步骤     首先新建一张测试表TEST,里面输入记录.由于删除/更 ...

  10. 栈的顺序存储和链式存储c语言实现

    一. 栈 栈的定义:栈是只允许在一端进行插入或删除操作的线性表. 1.栈的顺序存储 栈顶指针:S.top,初始设为-1 栈顶元素:S.data[S.top] 进栈操作:栈不满时,栈顶指针先加1,再到栈 ...