自定义实现链表很简单,只需要明白链表是什么样子的数据结构。

下图表示一种单向列表。其中指针first指向队头,last指向队尾,curr指向当前读的数据。

下面是我的实现代码,很简单,明白上述结构后,关键是构造一个内部类,里面包含一个指向下一个元素的对象(指向下一个元素的指针)

public class MyLinkedList<T>{

    /**
* 指向list中最后一个元素
*/
Node<T> last; /**
* 指向list中第一个元素
*/
Node<T> first; /**
* 指向当前读取的元素
*/
Node<T> currRead; private int size ; /**
* <默认构造函数>
*/
public MyLinkedList(){
size = 0;
last = new Node(null,-1);
first = last;
currRead = first;
} /**
* 往链表中添加数据(队尾添加数据)
* <功能详细描述>
* @param element
* @return
* @see [类、类#方法、类#成员]
*/
public T add(T element){
Node<T> newNode = new Node<T>(null,element);
last.next = newNode;
last = newNode;
if(size == 0){
first = newNode;
}
size ++;
return element;
} /**
* 移除链表中的数据(队头移除)
* <功能详细描述>
* @return
* @see [类、类#方法、类#成员]
*/
public T remove(){
if(size == 0){
System.out.println("empty list ");
currRead = first;
return null;
}
T result = first.element;
first = first.next;
currRead = first;
size--;
return result;
} /**
* 获取队列中的元素
* <功能详细描述>
* @return
* @see [类、类#方法、类#成员]
*/
public T get(){
if(currRead.next == null){
setReadAgain();
return currRead.element;
}
T result = currRead.element;
currRead = currRead.next;
return result;
} /**
* 再次从头开始读取数据
* <功能详细描述>
* @see [类、类#方法、类#成员]
*/
public void setReadAgain() {
currRead = first;
} public String toString(){
StringBuilder sb = new StringBuilder();
for(int i=0;i<size;i++){
T ele = get();
sb.append(currRead.element + "-->");
}
return sb.toString();
} /**
* 获取队列大小
* <功能详细描述>
* @return
* @see [类、类#方法、类#成员]
*/
public int getSize(){
return this.size;
} class Node<T> {
Node<T> next;
T element;
public Node( Node<T> next, T element){
this.next = next;
this.element = element;
}
}

实践一下,看能不能使用

public class Test {
public static void main(String[] args){ MyLinkedList linkedList = new MyLinkedList();
System.out.println("-------start-------");
System.out.println(linkedList.toString());
for (int i=0;i<5;i++){
linkedList.add(i+1);
}
System.out.println(linkedList.toString());
for(int i=0;i<5;i++){
System.out.println(linkedList.remove());
} System.out.println(linkedList.toString());
System.out.println("-------end-------");
}

下面是结果

Java 自定义实现链表的更多相关文章

  1. java自定义注解类

    一.前言 今天阅读帆哥代码的时候,看到了之前没有见过的新东西, 比如java自定义注解类,如何获取注解,如何反射内部类,this$0是什么意思? 于是乎,学习并整理了一下. 二.代码示例 import ...

  2. Java实现单链表的各种操作

    Java实现单链表的各种操作 主要内容:1.单链表的基本操作 2.删除重复数据 3.找到倒数第k个元素   4.实现链表的反转   5.从尾到头输出链表 6.找到中间节点 7.检测链表是否有环 8.在 ...

  3. java自定义注解实现前后台参数校验

    2016.07.26 qq:992591601,欢迎交流 首先介绍些基本概念: Annotations(also known as metadata)provide a formalized way ...

  4. java自定义注解注解方法、类、属性等等【转】

    http://anole1982.iteye.com/blog/1450421 http://www.open-open.com/doc/view/51fe76de67214563b20b385320 ...

  5. JAVA自定义注释(Target,Retention,Documented,Inherit)

    java自定义注解 Java注解是附加在代码中的一些元信息,用于一些工具在编译.运行时进行解析和使用,起到说明.配置的功能.注解不会也不能影响代码的实际逻辑,仅仅起到辅助性的作用.包含在 java.l ...

  6. Java自定义日志输出文件

    Java自定义日志输出文件 日志的打印,在程序中是必不可少的,如果需要将不同的日志打印到不同的地方,则需要定义不同的Appender,然后定义每一个Appender的日志级别.打印形式和日志的输出路径 ...

  7. Java自定义简单标签

     Java自定义简单标签可以方便的在页面输出信息,并且对于权限的控制,和对于Jsp标签和servlet代码的分离有着很好的作用. 下面将以权限的控制为例自定义一个标签: 一.标签类型 <wxt: ...

  8. java自定义注解知识实例及SSH框架下,拦截器中无法获得java注解属性值的问题

    一.java自定义注解相关知识 注解这东西是java语言本身就带有的功能特点,于struts,hibernate,spring这三个框架无关.使用得当特别方便.基于注解的xml文件配置方式也受到人们的 ...

  9. java实现单链表的增删功能

    JAVA 实现单链表的增删功能 package linked; class LinkedTable{ } public class LinkedTableTest { public static vo ...

随机推荐

  1. Error:Error #2174

    1.错误描述 Error:Error #2174 : 对于每个FileReference,每次只能执行一个下载.上载.加载或保存操作 2.错误原因 Flex中,在做单文件上传时,多次点击"上 ...

  2. C# md5加密方法

    public static string md5(string str, int code) { if (code == 16) //16位MD5加密(取32位加密的9~25字符) { return ...

  3. 如何登录mysql? cmd怎么连接mysql数据库||从MYSQL客户端登录MYSQL

    1 2 3 4 5 6 7 分步阅读 Mysql开源数据库,任何人都可以下载安装使用.那么安装好的mysql如何登陆连接mysql数据库呢?本经验咗嚛介绍几种常见的方法 工具/原料   mysql 连 ...

  4. JavaScript设计模式(8)-装饰者模式

    装饰者模式 1. 作用: 可用来透明地把对象包装在具有同样接口的另一对象之中,这样可以给一个方法添加一些行为,然后将方法调用传递给原始对象. 可用于为对象增加功能,用来代替大量子类. 装饰者对其组件进 ...

  5. each遍历的用法

  6. 【Luogu1345】周游加拿大(动态规划)

    [Luogu1345]周游加拿大(动态规划) 题面 题目描述 你赢得了一场航空公司举办的比赛,奖品是一张加拿大环游机票.旅行在这家航空公司开放的最西边的城市开始,然后一直自西向东旅行,直到你到达最东边 ...

  7. Bzoj4869: [Shoi2017]相逢是问候

    题面 传送门 Sol 摆定理 \[ a^b\equiv \begin{cases} a^{b\%\phi(p)}~~~~~~~~~~~gcd(a,p)=1\\ a^b~~~~~~~~~~~~~~~~~ ...

  8. [BZOJ3110] [Zjoi2013] K大数查询 (树套树)

    Description 有N个位置,M个操作.操作有两种,每次操作如果是1 a b c的形式表示在第a个位置到第b个位置,每个位置加入一个数c如果是2 a b c形式,表示询问从第a个位置到第b个位置 ...

  9. mount挂接命令使用

    挂接 操作系统 1.-t vfstype 指定文件系统的类型,通常不必指定.mount 会自动选择正确的类型.常用类型有: 光盘或光盘镜像:iso9660 DOS fat16文件系统:msdos Wi ...

  10. Android RecyclerView 滚动到中间位置

    最近看到QQ音乐的歌词每次滑动后都可以滚回到中间位置.觉得甚是神奇,打开开发者模式显示布局,发现歌词部分不是采用 android 控件的写的,应该是前端写的.于是,我想,能不能用 recyclerVi ...