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

下图表示一种单向列表。其中指针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. 使用Gulp进行代码压缩的步骤以及配置

    一.安装步骤 1.首先确定是否安装了node.js,如果未安装,请先安装node.js: 2.确定是否安装了包管理工具npm,如未安装请安装:npm install npm -g: 3.安装gulp: ...

  2. .Net利用Newtonsoft进行解析Json的快捷方法

    现在异构系统之间的数据交换多采用Json格式 .Net如何快捷地解析Json和将Object转换成json呢? 1.利用Newtonsoft解析Json字符串 在百度上查找资料,利用Newtonsof ...

  3. freemarker定义一个连续的序列(十九)

    1.简易说明 定义一个连续的序列,并打印出序列中的元素 2.实现源码 <#--freemarker定义了一个连续的序列--> <#assign nums=1..100/> &l ...

  4. C# 图解教程 第一章 C#和.NET框架

    C#和.NET框架 在.NET之前.NET时代 .NET框架的组成大大改进的编程环境 编译成CIL编译成本机代码并执行CLR Common Language RuntimeCLI Common Lan ...

  5. 二、CSS

    css基本语法及页面引用 css基本语法 css的定义方法是: 选择器 { 属性:值; 属性:值; 属性:值;} 选择器是将样式和页面元素关联起来的名称,属性是希望设置的样式属性每个属性有一个或多个值 ...

  6. thinkphp在mac下报错

    简要:众所周知,开发软件最好的环境是在MAC下;为此在黑苹果上,用Thinkphp开发;在过程中出现,找不到model以及数据库类型错误;为此向大家分享解决办法,希望能够帮助困惑的伙伴们,如果有不对或 ...

  7. springboot--springboot+mybatis多数据源最简解决方案

    说起多数据源,一般都来解决那些问题呢,主从模式或者业务比较复杂需要连接不同的分库来支持业务.我们项目是后者的模式,网上找了很多,大都是根据jpa来做多数据源解决方案,要不就是老的spring多数据源解 ...

  8. css - 移动端reset汇总与注释

    1.解决移动端触摸a元素,会有蓝色阴影 正常状态: 点击时状态: a{ outline:none; -webkit-tap-highlight-color: rgba(,,,); } -webkit- ...

  9. iOS开发中常见bug!(内附解答方法)

    序言 你是否曾经修复了一个 bug ,随后又发现了一个跟刚修复 bug 有关的 bug ,又或是修复 bug 的方式引起了另一个 bug ? 然而这些问题是绝佳的学习机会.所以我们怎样尽可能多地从修复 ...

  10. Samba原理和配置

    Samba原理和配置 个人原创,转载请注明,否则追究法律责任. 一,原理及安装 1,Samba是在Linux和UNIX系统上实现在局域网上共享文件一种通信协议,它为局域网内的不同计算机之间提供文件等资 ...