手写集合框架LinkedList实现篇

《手写集合框架》LinkedList篇

嘿嘿嘿,拖延症犯了,这几天不怎么想写代码,所以趁没事干就写写了。进入正文

    还是老套路嘻嘻嘻,因为我之前写了那个准备篇,对node已经描述的从差不多了,所以我就不过多描述了。 直接贴完代码强行解释一波 

一、定义接口

public interface newList<T> {    //定义泛型,因为Object可以存储任意类型,有时候我们需要
                                //用泛型 代替Object
    public void add(Object object);  //集合的添加方法
    public void add(int index,Object object);  //指定添加位置
    public int size();  //获取集合的长度
    public Object get(Integer i );  //获取下标的为i的元素
    public void remove(Object o);  //移除object对象
    public void remove(int index);  //移除size = index的元素  

}

二、编写LinkedList类

1.定义属性
     private newNode first = null ;   //第一个节点
    private newNode last = null  ; //最后一个节点
    private int size = 0;  // 集合的长度 

newNode还记得撒,我们上次定义了一个newNode类,整个链表的核心就是它,其他的内容就是方法也都是围绕它改改上下指向,来实现增删

2. add 添加方法
@Override
    public void add(Object t) {

        newNode newnode = new newNode();  //创建一个新的节点
        if(first == null) { // 如果链表的第一个为空
            newnode.Prev = null;
            newnode.object = t;   //第一个节点赋值
            newnode.Next = null;
            first = newnode ;
            last = newnode;    //最后一个节点就是当前新增进来的,下次添加一个节点时,prev就指向last
        }else {
            last.Next = newnode ; //我们要知道last是上一个节点
            newnode.Prev  =  last ;
            newnode.object = t ;
            newnode.Next = null;
            last = newnode ;
        }
        size ++;  //长度增加
    }
//节点遍历,拿到指定索引的元素
    private newNode Node(int index) {
        newNode temp = null;
        if(first !=null) {
            temp = first;
        }
        for (int i = 0; i < index; i++) {
                temp = temp.Next;
        }
        //从第一个元素开始依次循环,直到拿到
        return temp;
    }
@Override
    public void add(int index, Object object) {
        if(index == size) { //添加到最后
            newNode newnode = new newNode(); //新的元素
            newnode.Prev = last;
            newnode.object = object;
            last.Next = newnode;
            last = newnode;
        }else {  //插入到x的之前
            newNode node = this.Node(index);    //找到插入前的元素
            newNode newnode = new newNode();  //
            newNode prev = node.Prev;
            newnode.Prev = node.Prev;
            newnode.object = object;
            newnode.Next = node;
            if(node.Prev == null) {   //如果上指向为空,则它就是第一个
                first = newnode;
            }else {
                prev.Next = newnode;
                node.Prev = newnode;
            }
            last.Next = newnode;
            last = newnode;
        }
        size ++ ;
    }

我只讲一下,为什么将新的元素赋给last,因为我们把last当做了最后一个操作的,到时候我们添加的时候如果添加到最后一个,这个last就是指向的依据。

3.remove() 方法
 public void remove(int index) {
        newNode newnode = Node(index);
        deleteNode(newnode);
    }
    @Override
    public void remove(Object object) {
        if(object ==null) {  //== null 也是可以存在链表的 所以我们不排除这种情况
            for (newNode node = first; node != null; node = node.Next) {
                if(node.object == null) {
                    this.deleteNode(node);
                }
            }
        }else {
            for (newNode node = first; node != null; node = node.Next) {
                if(node.object.equals(object)) {
                    this.deleteNode(node);
                }
            }
        }

    }
    //写一个公共的元素删除方法
    public void deleteNode(newNode newnode) {
         final Object object= newnode.object;
         final newNode next = newnode.Next;
         final newNode prev = newnode.Prev;
        if(prev == null) {  //如果当前节点的Prev为空 则代表它本身是第一个
            first = next;
        }else {
              prev.Next = next;
              newnode.Prev = null;
        }

        if(next == null) {//如果当前节点的Next为空 则代表它本身是最后一个
            last = prev;
        }else {
            next.Prev = prev;
            newnode.Next = null;
        }
        size -- ;

    }
4.get 方法
@Override
    public Object get(Integer i){
        if(i<0 || i>size) {  //不符合逻辑
            try {
                throw new Exception();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        return Node(i).object;
    }
  • WeChat: lljb1218

原文地址:https://www.cnblogs.com/linjiab/p/12064117.html

时间: 2024-08-05 23:37:19

手写集合框架LinkedList实现篇的相关文章

手写集合框架LinkedList准备篇

Hello,我我我我林GG...我又回来了,短暂的假期~呼舒服(一次性看三部电影..一觉睡到中午 的感jio太....爽了),好勒,回到正题吧,请看下文. 自序:很多人看到这种名词就打退堂鼓的,就跟二叉树.B树一样,我一开始也是这样的,nimd,听起来真的高大尚(沃特???这是NM啥玩意),它们都是一种数据结构,其实并不难理解,千万不要被一个个名字所吓住,要知道都是人思考而来的东西,你怕个扥啊怕. 一. 理解Node节点以及单双向链表 我们先说一下单双向链表把: 1.啥是链表? 答:你戴过项链没

(二)springMvc原理和手写springMvc框架

我们从两个方面了解springmvc执行原理,首先我们去熟悉springmvc执行的过程,然后知道原理后通过手写springmvc去深入了解代码中执行过程. (一)SpringMVC流程图 (二)SpringMVC流程 1.  用户发送请求至前端控制器DispatcherServlet. 2.  DispatcherServlet收到请求调用HandlerMapping处理器映射器. 3.  处理器映射器找到具体的处理器(可以根据xml配置.注解进行查找),生成处理器对象及处理器拦截器(如果有则

手写SpringMVC 框架

手写SpringMVC框架 细嗅蔷薇 心有猛虎 背景:Spring 想必大家都听说过,可能现在更多流行的是Spring Boot 和Spring Cloud 框架:但是SpringMVC 作为一款实现了MVC 设计模式的web (表现层) 层框架,其高开发效率和高性能也是现在很多公司仍在采用的框架:除此之外,Spring 源码大师级的代码规范和设计思想都十分值得学习:退一步说,Spring Boot 框架底层也有很多Spring 的东西,而且面试的时候还会经常被问到SpringMVC 原理,一般

手写Spring框架,加深对Spring工作机制的理解!

在我们的日常工作中,经常会用到Spring.Spring Boot.Spring Cloud.Struts.Mybatis.Hibernate等开源框架,有了这些框架的诞生,平时的开发工作量也是变得越来越轻松,我们用 Spring Boot 分分钟可以新建一个Web项目. 记得自己刚开始工作的时候还是在用Servlet写Web项目,自己写数据库连接池,用原生JDBC操作数据库,好了不发散了.回到这篇文章的主题,今天通过手写Spring框架,帮大家深入了解一下Spring的工作机制,文中涉及的代码

手写springIoc框架

springIoc的底层实现原理 1.读取bean的XML配置文件 2.使用beanId查找bean配置,并获取配置文件中class地址. 3.使用Java反射技术实例化对象 4.获取属性配置,使用反射技术进行赋值 使用人家spring框架读取对象 创建实体 package com.itmayiedu.service; public class UserEntity { private String userId; private String userName; public UserEnti

自己动手写集合框架决心篇

网上有很多关于这些的内容,我今天写的原因,是为了记录一下自己的学习过程,顺便巩固一下过去的所学的,我想把这些当做我生活中的一部分,并一步步深入学习下去.并附上一句经典名言(基础不牢,地动上摇!) let's go!我们先来了解一下集合体系,向下看 学过了javase,对上面的大部分过内容应该都非常了解了,至少我们知道了集合的四大接口:collection.List.Set.Map,其中List和Set是属于Collection下的子接口.关于接口下面的实现类,不再过多阐述,另外还有两个要侧重了解

一文全解:利用谷歌深度学习框架Tensorflow识别手写数字图片(初学者篇)

笔记整理者:王小草 笔记整理时间2017年2月24日 原文地址 http://blog.csdn.net/sinat_33761963/article/details/56837466?fps=1&locationNum=5 Tensorflow官方英文文档地址:https://www.tensorflow.org/get_started/mnist/beginners 本文整理时官方文档最近更新时间:2017年2月15日 1.案例背景 本文是跟着Tensorflow官方文档的第二篇教程–识别手

纯手写SpringBoot框架之注解方式启动SpringMVC容器

使用Java语言创建Tomcat容器,并且通过Tomcat执行Servlet,接下来,将会使用Java语言在SpringBoot创建内置Tomcat,使用注解方式启动SpringMVC容器. 代码实现.1.pom.xml文件,需要依赖的jar包. <dependencies> <!--Java语言操作Tomcat--> <dependency> <groupId>org.apache.tomcat.embed</groupId> <arti

尝试手写orm框架

前言: 在使用各种的orm框架的过程中,菜鸟的我始终没有搞懂底层实现技术,最近刚好没事找了些视频和资料了解一点皮毛,想记录下,大家勿喷. 所谓的ORM(Object Relational Mapping) 对象关系映射 官方解释是通过使用描述对象和数据库之间映射的元数据,将面向对象程序的对象自动持久化到关系数据库中. 个人理解就是一个数据库访问的帮助类,可以让我们不用手写sql,就完成数据库的访问 使用的技术: 泛型.反射.特性.扩展 摸索步骤: step1 新建项目,建几个类库,大家熟悉的三层