一:引言

实现的方法 LinkList类都有 自带的 可以直接调用 ,这是为了熟悉底层代码 敲了一下基本用法 ,主要以高琪老师讲的来写

二:上码

package cn.wyj.two;import java.awt.image.RasterFormatException;/**自定义一个链表* @param args*/public class Demo2_LinkedList<E> {private Node first;private Node last;private int size = 0;public void add(E element)//alt + shift + R 可以直接改{Node node = new Node(element);if(first == null){first = node;last = node;}else{node.previous = last;node.next = null;//尾插法last.next = node;last = node;}    this.size++;}//元素个数public int size(){return this.size;}//删除索引位置元素public void remove(int index){checkRange(index);Node temp = getNode(index);if(temp != null){Node up = temp.previous;Node down = temp.next;if(up != null){up.next = down;}if(down != null){down.previous = up;}if(index == 0){first = down;}if(index == size-1){last = up;}}}//在指定位置插入元素public void add(int index,E element){checkRange(index);Node newNode = new Node(element);Node temp = getNode(index);if(temp!= null){if(index == 0){newNode.next = first;first.previous = newNode;newNode.previous = null;first = newNode;}if(index == size - 1){temp.next = newNode;newNode.previous = temp;}else{Node up = temp.previous;up.next = newNode;newNode.previous = up;temp.previous = newNode;newNode.next = temp;}    }   this.size++;}//获取索引位置的元素//a b c d e f g//0 1 2 3 4 5 6 public Object get(int index){checkRange(index);Node temp = getNode(index);return temp!=null?temp.element:null;}public Node getNode(int index){Node temp = null;if(index <= ( size()>>1)){temp = first;for( int i = 0; i < index; i++ ){temp = temp.next;} }else{temp = last;for( int j = size-1; j > index; j--){//System.out.println(i);temp = temp.previous;}}return temp;}private void checkRange(int index){if(index < 0 || index >= size){throw new RasterFormatException("索引位置不合法"+index);}}//重写toString()方法public String toString(){StringBuilder sb = new StringBuilder();sb.append("[");Node temp = first;while( temp != null){sb.append(temp.element+"、");temp = temp.next;}sb.setCharAt(sb.length()-1, ']');return sb.toString();}public static void main(String[] args) {// TODO Auto-generated method stubDemo2_LinkedList<String> l1 = new Demo2_LinkedList<String>();l1.add("a");l1.add("b");l1.add("c");l1.add("d");l1.add("e");l1.add("f");l1.add("g");System.out.println(l1);System.out.println(l1.size());Object obj = l1.get(5);System.out.println(obj);//     l1.remove(6);
//      System.out.println(l1);
        l1.remove(3);
        System.out.println(l1);
//      l1.remove(4);
//      System.out.println(l1);l1.add(0, "王老二");System.out.println(l1);}}

结点类:

package cn.wyj.two;public class Node {Node previous;Node next;Object element;public Node() {super();}public Node(Object element) {super();this.element = element;}public Node(Node previous, Node next, Object element) {super();this.previous = previous;this.next = next;this.element = element;}}

Java手撕Linkedlist(双向链表)基本用法的实现相关推荐

  1. java手撕KMeans算法实现手写数字聚类(失败案例)

    最近几天刚刚接触机器学习,学完K-Means聚类算法.正好又赶上一个课程项目是识别"手写数字",因为KMeans能够实现聚类,因此自然而然地想要通过KMeans来实现. 前排提示: ...

  2. JAVA 手撕底层arrayList代码(arrayList的简单实现)

    一:引言: 这些方法根本不用写,list类当中都有这些方法,可以直接调用,但为了解list类的底层 所以手写了一便 只是实现了简单方法 二:上码: package cn.wyj.two;import ...

  3. 手写LinKedList双向链表 终于搞清了什么是链表结构

    之前对Collection这块底层实现和异同点一直模糊不清,最近手动写了个链表结构实现LinKedList ,发现很多知识还是要不断去实践,专研,才能不断提升. LinKedList 实现 List接 ...

  4. 手撕设计模式之「工厂方法模式」(Java描述)

    前言 工厂方法模式是对简单工厂模式的改进,它通过对工厂类进行抽象形成一个抽象工厂接口,再让具体的工厂负责对应产品的创建,使得在增加产品的场景中也满足"开闭原则".希望通过本文的学习 ...

  5. 手撕设计模式之「简单工厂模式」(Java描述)

    前言 利用简单工厂模式可以实现对象创建和业务逻辑处理的分离,但存在工厂类职责过重,增添新产品违背开闭原则等问题.它不属于GoF 23种设计模式之一,但是它可以作为学习工厂方法模式前的一个很好的引导. ...

  6. 手撕Java源码系列之Map接口

    Map简介 #Map是以Key和Value进行存储的,这点就是与Collection做一个区别.Map的Key不可重复,但是value可以重复.而Collection最直观的感受就是其子接口Set,仅 ...

  7. 手撕生产者-消费者模式 | P问题、NP问题

    目录 手撕BlockingQueue 生产者-消费者模式 P问题.NP问题 手撕BlockingQueue public class RequestQueue {private final Queue ...

  8. 手撕面试题:多个线程交替打印问题

    点击上方蓝色"方志朋",选择"设为星标" 回复"666"获取独家整理的学习资料! 第一篇打算总结下阿里最喜欢问的多个线程顺序打印问题,我遇到 ...

  9. redis mysql主从同步_手撕Redis,主从同步

    原标题:手撕Redis,主从同步 一.主从同步的工作原理 redis主从复制过程: 当配置好slave后,slave与master建立连接,然后发送sync命令.无论是第一次连接还是重新连接,mast ...

最新文章

  1. C# Obsolete(已弃用方法属性)
  2. Java中关于进程和线程的理解
  3. 无星的RN学习之旅(四)——通信、持久化存储、iOS打包
  4. leetcode - 1218. 最长定差子序列 (使用哈希表)
  5. java获取指定倒退或向前的时间工具类
  6. C#socket编程序(二)
  7. 三周第四次课(12月28日)
  8. Spark RDD、DataFrame和DataSet的区别
  9. Idea设置背景色设置为护眼色
  10. Typora免费版下载【Mac、Windows】
  11. windows server 2012的DHCP保留地址导出导入、DHCP故障转移配置、DNS条目命令导入
  12. 2.ISIS协议原理
  13. NShape(开源矢量图形编辑器) 基本功能开发(一)
  14. 全国5M分辨率遥感图免费下载!还有遥感卫星视频可下载
  15. #01 Linear Regression Excise
  16. python微信转账记录_python 处理微信对账单数据的实例代码
  17. Windows 10新版可以更新了!这些新功能值得升级
  18. 默慈金数 (hdu3723)
  19. 第十一章 曲线积分与曲面积分
  20. Barsetto百胜图BAC731B智能胶囊咖啡机测评,醇香相伴随性生活

热门文章

  1. 开发中 MySQL 规范
  2. C# 读写ini文件 保存信息
  3. Android 清除png图片的白色背景
  4. ArcGIS实验教程——实验三十九:ArcGIS多元分类(ISO聚类分析、最大似然分类、主成分分析)案例教程
  5. 华为云GaussDB,11.11让企业无后顾之忧
  6. 字符串之替换字符串中连续出现的指定字符串
  7. (十)python3 只需3小时带你轻松入门——模块与包
  8. php多个文件上传代码,PHP单文件上传类或多文件上传类源码
  9. python本地库_Python学习第71课-本地建立repository仓库
  10. 年度迷惑新闻:美女其实是个男生?