java实现链表模拟LinkedList类

LinkedList类底层数据结构

模拟:

  1 package Collection;
  2
  3 public class MyLinkedList {
  4     Node first;
  5     Node last;
  6     private int size;
  7     public MyLinkedList(){
  8
  9     }
 10     /*
 11      * 添加一个新对象
 12      * */
 13     public boolean add(Object obj){
 14         Node node = new Node();
 15         if(first == null){
 16             first = node;
 17             last = node;
 18             node.prev = null;
 19             node.next = null;
 20             node.obj = obj;
 21         }else{
 22             node.prev = last;//下一个关联上一个
 23             node.next = null;
 24             node.obj = obj;
 25             last.next = node;//上一个关联下一个
 26             last = node;
 27         }
 28         size++;
 29         return true;
 30     }
 31     /*
 32      * 在index处添加一个新元素,作为index对应的元素
 33      * */
 34     public boolean add(int index, Object obj){
 35         checkBound(index);
 36         Node node = this.first;
 37         Node nodeTemp = new Node();
 38         if(index == 0){
 39             nodeTemp.obj = obj;
 40             nodeTemp.prev = null;
 41             nodeTemp.next = this.first;
 42             this.first.prev = nodeTemp;
 43             this.first = nodeTemp;
 44             size++;
 45         }else if(index == size - 1){
 46             add(obj);
 47             size++;
 48         }else{
 49             nodeTemp.obj = obj;
 50             for(int i = 0; i < index; i++)
 51                 node = node.next;
 52             nodeTemp.next = node;
 53             nodeTemp.prev = node.prev;
 54             node.prev.next = nodeTemp;
 55             node.prev = nodeTemp;
 56             size++;
 57         }
 58         return true;
 59     }
 60     /*
 61      * 获得元素个数
 62      * */
 63     public int size(){
 64         return this.size;
 65     }
 66     /*
 67      * 按照index获得元素
 68      * */
 69     public Object get(int index){
 70         checkBound(index);
 71         Node node = this.first;
 72         for(int i = 0; i < index; i++)
 73             node = node.next;
 74         if(node != null)
 75             return node.obj;
 76         else
 77             return null;
 78     }
 79     /*
 80      * 移除index处的元素
 81      * */
 82     public boolean remove(int index){
 83         checkBound(index);
 84         Node node = this.first;
 85         if(index == 0){
 86             this.first = this.first.next;
 87             size--;
 88         }else if(index == size - 1){
 89             for(int i = 0; i < index; i++)
 90                 node = node.next;
 91             node.prev.next = null;
 92             size--;
 93         }else{
 94             for(int i = 0; i < index; i++)
 95                 node = node.next;
 96             node.prev.next = node.next;
 97             node.next.prev = node.prev;
 98             size--;
 99         }
100         return true;
101     }
102     /*
103      * 移除obj对象
104      * */
105     public boolean remove(Object obj){
106         remove(indexOf(obj));
107         return true;
108     }
109     /*
110      * 检索对象obj,返回index
111      * */
112     private int indexOf(Object obj){
113         Node node = this.first;
114         for(int i = 0; i < this.size; i++){
115             if(node.obj.equals(obj))
116                 return i;
117             node = node.next;
118         }
119         return -1;
120     }
121     /*
122      * 倒序检索
123      * */
124     public int lastIndexof(Object obj){
125         Node node = this.last;
126         for(int i = 0; i < this.size; i++){
127             if(node.obj.equals(obj))
128                 return size - i - 1;
129             node = node.prev;
130         }
131         return -1;
132     }
133     /*
134      * 检查边界
135      * */
136     private void checkBound(int index){
137         if(index < 0 || index > this.size)
138             try {
139                 throw new Exception();
140             } catch (Exception e) {
141                 // TODO Auto-generated catch block
142                 e.printStackTrace();
143             }
144     }
145 }
146 /*
147  * Node类
148  * */
149 class Node{
150     Node prev;
151     Node next;
152     Object obj;
153     public Node(){
154
155     }
156 }
时间: 2024-10-06 13:22:04

java实现链表模拟LinkedList类的相关文章

Java集合框架之LinkedList类

ArrayList用数组作为其保存元素的数据结构,而LinkedList采用的是链表的数据结构.而ArrayList和LinkedList都是线性表list.但LinkedList并不具备随机访问能力,而ArrayList拥有. 对于链表集合,首先(1)我们使用API里现成的LinkedList类来进行一些分析,之后(2)我们再用自身的java代码实现链表及其LinkedList中相对应的方法. (1)现成API接口的分析使用 定义如下,与ArrayList类似. LinkedList<Stri

Java LinkedList类链表

LinkedList类扩展AbstractSequentialList并实现了List接口.它提供了一个链接表数据结构. LinkedList类支持两种构造函数.第一个构造函数建立一个空链表: LinkedList( ) 下面的构造函数建立一个与集合c中的元素初始化链表. Original contents of ll: [A, A2, F, B, D, E, C, Z] Contents of ll after deletion: [A, A2, D, E, C, Z] ll after de

java集合框架--ArrayList类、Vector和LinkedList类

1.ArrayList类概述 底层数据结构是数组,查询块,增删慢. 线程不安全,效率高. 2.ArrayList案例 2.1存储字符串并遍历 package com; import java.util.ArrayList; import java.util.Iterator; import java.util.ListIterator; public class ArrayListDemo { public static void main(String[] args) { //创建ArrayL

JDK1.8源码(六)——java.util.LinkedList 类

上一篇博客我们介绍了List集合的一种典型实现 ArrayList,我们知道 ArrayList 是由数组构成的,本篇博客我们介绍 List 集合的另一种典型实现 LinkedList,这是一个由链表构成的数组,关于链表的介绍,在这篇博客中 我们也详细介绍过,本篇博客我们将介绍 LinkedList 是如何实现的. 1.LinkedList 定义 LinkedList 是一个用链表实现的集合,元素有序且可以重复. 1 public class LinkedList<E> 2 extends A

数据结构-List接口-LinkedList类-Set接口-HashSet类-Collection总结

一.数据结构:4种--<需补充> 1.堆栈结构:     特点:LIFO(后进先出);栈的入口/出口都在顶端位置;压栈就是存元素/弹栈就是取元素;     代表类:Stack;     其它:main方法最后一个出去; 2.数组结构:     特点:一片连续的空间;有索引,查找快;增删慢;     代表类:ArrayList;     应用场景:用于查询多的场景,如天气预报; 3.队列结构:     特点:FIFO(先进先出);入口/出口在两侧;     代表:Queue接口     应用场景

Java 集合系列 04 LinkedList详细介绍(源码解析)和使用示例

java 集合系列目录: Java 集合系列 01 总体框架 Java 集合系列 02 Collection架构 Java 集合系列 03 ArrayList详细介绍(源码解析)和使用示例 Java 集合系列 04 LinkedList详细介绍(源码解析)和使用示例 概要  和学习ArrayList一样,接下来呢,我们先对LinkedList有个整体认识,然后再学习它的源码:最后再通过实例来学会使用LinkedList.内容包括:第1部分 LinkedList介绍第2部分 LinkedList数

Java源码之LinkedList

Java源码之LinkedList 转载请注意出处:http://blog.csdn.net/itismelzp/article/details/51620311 一.LinkedList概述 本文采用jdk1.8进行分析. LinkedList实现了List,Deque接口的双向链表,实现了链表的所有可选操作,并且可有null值.查找某个值的时候必须从头到尾的遍历链表.它是非线程安全的,当多个线程结构化修改同一链表时需要加上同步处理.(程结构化修改包括:添加.删除,不包括:修改值)可使用Col

Java学习笔记之LinkedList基本用法

更多信息可参考我的个人博客:贱贱的梦想 LinkedList简介 LinkedList 是一个继承于AbstractSequentialList的双向链表.它也可以被当作堆栈.队列或双端队列进行操作. LinkedList 实现 List 接口,能进行队列操作. LinkedList 实现 Deque 接口,即能将LinkedList当作双端队列使用. ArrayList底层是由数组支持,而LinkedList 是由双向链表实现的,其中的每个对象包含数据的同时还包含指向链表中前一个与后一个元素的

java实现链表

今天和同学讨论时,他说java没有指针怎么实现链表.的确,在Java中没有指针.但是,Java中引用和C++中的引用有很大不同,而且具有一定指针的功能(过两天会总结).所以,就在家用Java实现了一下链表这种数据结构.目前我想到了两种方法用Java实现链表: 1.Java允许类的定义中出现该类对象,所以可以通过对该类对象的引用实现链表. 2.可以通过定义一个基类,通过子类的向上转型.通过父类指针模拟C++中的指针类型,从而实现链表. 废话不多说,上代码: 方法1 Node.java: packa