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

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

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

  1. public class MyLinkedList<T>{
  2.  
  3. /**
  4. * 指向list中最后一个元素
  5. */
  6. Node<T> last;
  7.  
  8. /**
  9. * 指向list中第一个元素
  10. */
  11. Node<T> first;
  12.  
  13. /**
  14. * 指向当前读取的元素
  15. */
  16. Node<T> currRead;
  17.  
  18. private int size ;
  19.  
  20. /**
  21. * <默认构造函数>
  22. */
  23. public MyLinkedList(){
  24. size = 0;
  25. last = new Node(null,-1);
  26. first = last;
  27. currRead = first;
  28. }
  29.  
  30. /**
  31. * 往链表中添加数据(队尾添加数据)
  32. * <功能详细描述>
  33. * @param element
  34. * @return
  35. * @see [类、类#方法、类#成员]
  36. */
  37. public T add(T element){
  38. Node<T> newNode = new Node<T>(null,element);
  39. last.next = newNode;
  40. last = newNode;
  41. if(size == 0){
  42. first = newNode;
  43. }
  44. size ++;
  45. return element;
  46. }
  47.  
  48. /**
  49. * 移除链表中的数据(队头移除)
  50. * <功能详细描述>
  51. * @return
  52. * @see [类、类#方法、类#成员]
  53. */
  54. public T remove(){
  55. if(size == 0){
  56. System.out.println("empty list ");
  57. currRead = first;
  58. return null;
  59. }
  60. T result = first.element;
  61. first = first.next;
  62. currRead = first;
  63. size--;
  64. return result;
  65. }
  66.  
  67. /**
  68. * 获取队列中的元素
  69. * <功能详细描述>
  70. * @return
  71. * @see [类、类#方法、类#成员]
  72. */
  73. public T get(){
  74. if(currRead.next == null){
  75. setReadAgain();
  76. return currRead.element;
  77. }
  78. T result = currRead.element;
  79. currRead = currRead.next;
  80. return result;
  81. }
  82.  
  83. /**
  84. * 再次从头开始读取数据
  85. * <功能详细描述>
  86. * @see [类、类#方法、类#成员]
  87. */
  88. public void setReadAgain() {
  89. currRead = first;
  90. }
  91.  
  92. public String toString(){
  93. StringBuilder sb = new StringBuilder();
  94. for(int i=0;i<size;i++){
  95. T ele = get();
  96. sb.append(currRead.element + "-->");
  97. }
  98. return sb.toString();
  99. }
  100.  
  101. /**
  102. * 获取队列大小
  103. * <功能详细描述>
  104. * @return
  105. * @see [类、类#方法、类#成员]
  106. */
  107. public int getSize(){
  108. return this.size;
  109. }
  110.  
  111. class Node<T> {
  112. Node<T> next;
  113. T element;
  114. public Node( Node<T> next, T element){
  115. this.next = next;
  116. this.element = element;
  117. }
  118. }

实践一下,看能不能使用

  1. public class Test {
  2. public static void main(String[] args){
  3.  
  4. MyLinkedList linkedList = new MyLinkedList();
  5. System.out.println("-------start-------");
  6. System.out.println(linkedList.toString());
  7. for (int i=0;i<5;i++){
  8. linkedList.add(i+1);
  9. }
  10. System.out.println(linkedList.toString());
  11. for(int i=0;i<5;i++){
  12. System.out.println(linkedList.remove());
  13. }
  14.  
  15. System.out.println(linkedList.toString());
  16. System.out.println("-------end-------");
  17. }

下面是结果

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. C# 通过smtp服务器进行邮件发送 MailHelper

    C# 通过smtp服务器进行邮件发送 MailHelper.cs using System; using System.Data; using System.Configuration; using ...

  2. 芝麻HTTP:如何寻找爬虫入口

    寻找爬虫入口 1 .本次任务的入口 这个爬虫的更好的入口就是我们平常使用的搜索引擎.搜索引擎虽然有很多种,但是其实都是在干一件事,收录网页,处理,然后提供搜索服务.在平时使用的过程中,我们通常都是直接 ...

  3. 小白学爬虫-在无GUI的CentOS上使用Selenium+Chrome

    爬虫代理IP由芝麻HTTP服务供应商提供各位小伙伴儿的采集日常是不是被JavaScript的各种点击事件折腾的欲仙欲死啊?好不容易找到个Selenium+Chrome可以解决问题! 但是另一个▄█▀█ ...

  4. 使用定时器限制点击按钮发送短信(附源码)--JavaScript小案例

    不说多哈,有注释哦,直接贴代码了哈,有疑问请追评呢…… 1.禁用按钮: this.disabled = "disabled"(this指按钮)或: this.disabled = ...

  5. PyTorch官方中文文档:torch.optim

    torch.optim torch.optim是一个实现了各种优化算法的库.大部分常用的方法得到支持,并且接口具备足够的通用性,使得未来能够集成更加复杂的方法. 如何使用optimizer 为了使用t ...

  6. 端口被占用:android studio 虚拟机adb.exe已停止工作的处理

    浏览:2190 | 更新:2017-09-16 05:00 1 2 3 4 5 6 分步阅读 在搭建android studio开发环境后,开始编程调试程序时,不管运行虚拟机还是真机,都不停出现&qu ...

  7. MySQL的B树索引与索引优化

    MySQL的MyISAM.InnoDB引擎默认均使用B+树索引(查询时都显示为"BTREE"),本文讨论两个问题: 为什么MySQL等主流数据库选择B+树的索引结构? 如何基于索引 ...

  8. Splay入门解析【保证让你看不懂(滑稽)】

    BST真是神奇的东西... 而且种类好多呀... 我这个蒟蒻只学会了splay orzCJ老爷,各种树都会 好好好,不说了,直接说splay. 不知道splay是啥,,你也要知道平衡树是啥... 平衡 ...

  9. THUWC2018咸鱼记

    Day -inf 好不容易联赛水进来了 好虚啊...(萌新)什么都不会...只会大水题 估计要\(GG\)了,瑟瑟发抖 准备辣.. 自我介绍根本没面试,就没脸贴了 周围的大佬们(尤其\(Zsy\))还 ...

  10. Dapper一个和petapoco差不多的轻量级ORM框架

    我们都知道ORM全称叫做Object Relationship Mapper,也就是可以用object来map我们的db,而且市面上的orm框架有很多,其中有一个框架 叫做dapper,而且被称为th ...