概念

LinkedList级双向链表,它的单位是节点,每一个节点都要一个头指针和一个尾指针,称为前驱和后继。第一个节点的头指针指向最后一个节点,最后一个节点的尾指针指向第一个节点,形成环路。

链表增删速度快,查询速度慢。

手写LinkedList

通过今天手写LinkedList,我觉得,我并没有体验到链表比ArrayList快,以后再来深究。

先写一个MyLinkedList类

  1. package _20191210;
  2.  
  3. import java.util.NoSuchElementException;
  4.  
  5. public class MyLinkedList<E> {
  6. //List myLikedList = new LinkedList();
  7. Node<E> first;
  8. Node<E> last;
  9. transient int size = 0;
  10. public MyLinkedList(){
  11.  
  12. }
  13.  
  14. //linkFirst 插为第一个节点
  15. private void linkFirst(E e) {
  16. final Node<E> f = first;
  17. final Node<E> newNode = new Node<E>(null,e,f);
  18. first = newNode;
  19. if(f == null)
  20. last = newNode;
  21. else
  22. f.prev = newNode;
  23. size++;
  24. // modSize++;
  25. }
  26.  
  27. //linkLast 插为最后一个节点
  28. private void linkLast(E e) {
  29. final Node<E> l = last;
  30. final Node<E> newNode = new Node<E>(last,e,null);
  31. last = newNode;//将它作为最后一个节点last
  32. if(l == null)//当插入的是列表中的第一个节点时,将该节点设为last与first
  33. first = newNode;
  34. else
  35. l.next = newNode;
  36. size++;
  37. // modCount++;
  38. }
  39. //addFirst 添加到列表的第一个
  40. public void addFirst(E e) {
  41. linkFirst(e);
  42. }
  43. //addLast
  44. public void addLast(E e) {
  45. linkLast(e);
  46. }
  47. //add
  48. public void add(E e) {
  49. linkLast(e);
  50.  
  51. }
  52. /**
  53. * returns the first element in this List
  54. */
  55. public E getFirst() {
  56. final Node<E> f = first;
  57. if(f == null) {
  58. throw new NoSuchElementException();
  59. }
  60. return f.item;
  61. }
  62. //getLast返回最后一个元素
  63. public E getLast() {
  64. final Node<E> l = last;
  65. if(last == null) {
  66. throw new NoSuchElementException();
  67. }
  68. return l.item;
  69. }
  70. /**
  71. * removes and returns the first element from the link list.
  72. */
  73. public E removeFirst(){
  74. final Node<E> f = first;
  75. final Node<E> next = first.next;
  76. if(f == null) {
  77. throw new NoSuchElementException();
  78. }
  79. first = next;
  80. first.prev = null;
  81. size--;
  82. return f.item;
  83. }
  84. /**
  85. * removes and returns the last element from link list
  86. */
  87. public E removeLast() {
  88. final Node<E> l = last;
  89. if(l == null) {
  90. throw new NoSuchElementException();
  91. }
  92. if(last.prev == null) {
  93. E e = last.item;
  94. last = null;
  95. first = null;
  96. size--;
  97. return e;
  98. }
  99. final Node<E> prev = last.prev;
  100. last = prev;
  101. size--;
  102. return l.item;
  103. }
  104. /**
  105. * returns the size of this list
  106. */
  107. public int size() {
  108. return size;
  109. }
  110. /**
  111. * remove the first occurrence of the specified element form this list,if it is
  112. * present.
  113. */
  114. public boolean remove(Object o) {
  115. Node<E> tmp = first;
  116. while(tmp!=null) {
  117. if(tmp.item == o) {
  118. Node<E> prev = tmp.prev;
  119. Node<E> next = tmp.next;
  120. prev.next = next;
  121. next.prev = prev;
  122. size--;
  123. return true;
  124. }
  125. tmp = tmp.next;
  126. }
  127. return false;
  128. }
  129. /**
  130. * returns the index of the first occurrence of the specified element in this list
  131. * or -1 if this list does not contain the element
  132. */
  133. public int indexOf(Object o) {
  134. int index = 0;
  135. if(null == o) {
  136. for(Node<E> f = first;f != null;f = f.next) {
  137. if(f.item==o) {
  138. return index;
  139. }
  140. index++;
  141. }
  142. }else {
  143. for(Node<E> f = first;f != null;f = f.next) {
  144. if(o.equals(f.item)) {
  145. return index;
  146. }
  147. index++;
  148. }
  149. }
  150. return -1;
  151. }
  152. //toString
  153. public String toString() {
  154. StringBuffer sb = new StringBuffer();
  155. sb.append("[");
  156. Node<E> tmp = null;
  157. tmp = first;
  158. do{
  159. if(tmp==null) break;
  160. sb.append(tmp.item);
  161. if(tmp.next!=null) sb.append(", ");
  162. tmp = tmp.next;
  163.  
  164. }while(tmp!=null);
  165. sb.append("]");
  166. return sb.toString();
  167. }
  168.  
  169. //内部类:节点
  170. private static class Node<E>{
  171. E item;//本体
  172. Node<E> next;//后继
  173. Node<E> prev;//前驱
  174. public Node(Node<E> prev,E element,Node<E> next) {
  175. this.item = element;
  176. this.next = next;
  177. this.prev = prev;
  178. }
  179. }
  180. }

  

再写一个MyLinkedListTest测试类,测试手写LinkedList与官方LinkedList的运行结果。

  1. package _20191210;
  2.  
  3. import java.util.LinkedList;
  4. import java.util.List;
  5.  
  6. public class MyLinkedListTest {
  7. public static void main(String[] args) {
  8. System.out.println("---------自己写的LinkedList-----------");
  9. MyLinkedList<String> mk = new MyLinkedList<>();
  10. mk.add("Y");
  11. mk.add("E");
  12. mk.add("S");
  13. System.out.println(mk);
  14. System.out.println(mk.size());
  15. System.out.println("移除E:"+mk.remove("E"));
  16. System.out.println(mk);
  17. System.out.println(mk.getFirst());
  18. System.out.println(mk.getLast());
  19. System.out.println("S的位置为:"+mk.indexOf("S"));
  20. System.out.println("removeFirst:"+mk.removeFirst());
  21. System.out.println(mk.size());
  22. System.out.println(mk);
  23. System.out.println("removeLast:"+mk.removeLast());
  24. System.out.println(mk);
  25. System.out.println("---------官方LinkedList-------------");
  26. LinkedList<String> linkList = new LinkedList<>();
  27. linkList.add("Y");
  28. linkList.add("E");
  29. linkList.add("S");
  30. System.out.println(linkList);
  31. System.out.println(linkList.size());
  32. System.out.println("移除E:"+linkList.remove("E"));
  33. System.out.println(linkList);
  34. System.out.println(linkList.getFirst());
  35. System.out.println(linkList.getLast());
  36. System.out.println("S的位置为:"+linkList.indexOf("S"));
  37. System.out.println("removeFirst:"+linkList.removeFirst());
  38. System.out.println(linkList.size());
  39. System.out.println(linkList);
  40. System.out.println("removeLast:"+linkList.removeLast());
  41. System.out.println(linkList);
  42.  
  43. }
  44. }

  

45 容器(四)——手写LinkedList的更多相关文章

  1. 链表设计与Java实现,手写LinkedList这也太清楚了吧!!!

    链表设计与实现 在谈链表之前,我们先谈谈我们平常编程会遇到的很常见的一个问题.如果在编程的时候,某个变量在后续编程中仍需使用,我们可以用一个局部变量来保存该值,除此之外一个更加常用的方法就是使用容器了 ...

  2. (一)LinkedList集合解析及手写集合

    一.LinkedList集合特点 问题 结      论 LinkedList是否允许空 允许 LinkedList是否允许重复数据 允许 LinkedList是否有序 有序 LinkedList是否 ...

  3. 【Java】 ArrayList和LinkedList实现(简单手写)以及分析它们的区别

    一.手写ArrayList public class ArrayList { private Object[] elementData; //底层数组 private int size; //数组大小 ...

  4. 3 手写Java HashMap核心源码

    手写Java HashMap核心源码 上一章手写LinkedList核心源码,本章我们来手写Java HashMap的核心源码. 我们来先了解一下HashMap的原理.HashMap 字面意思 has ...

  5. 1 手写Java ArrayList核心源码

    手写ArrayList核心源码 ArrayList是Java中常用的数据结构,不光有ArrayList,还有LinkedList,HashMap,LinkedHashMap,HashSet,Queue ...

  6. opencv 手写选择题阅卷 (四)Android端 手机应用开发

    opencv 手写选择题阅卷 (四)Android 手机应用开发 在PC端把代码调通以后开始开发Android 手机应用,因为主要功能代码为C++代码,所以需要通过NDK编译,JAVA通过JNI方式调 ...

  7. tensorflow笔记(四)之MNIST手写识别系列一

    tensorflow笔记(四)之MNIST手写识别系列一 版权声明:本文为博主原创文章,转载请指明转载地址 http://www.cnblogs.com/fydeblog/p/7436310.html ...

  8. HTTP网络协议与手写Web服务容器

    Http协议 1.深入概念 Http:HyperText Transfer Protocol,即是超文本传输协议. 2.浅出概念(使用浏览器访问服务器端网页时需要遵循的一系列规则) Http:将各种不 ...

  9. 手写实现ArrayList & LinkedList

    微信公众号:程序媛的非程序人生 关注可了解更多资讯.问题或建议,请公众号留言; 1.手写实现ArrayList     2.手写实现 LinkedList       3.LinkedList的数据结 ...

随机推荐

  1. 浅谈H5图片中object-fit的属性及含义/ 小程序image mode属性中scaleToFill,aspectFit,widthFix等类似

    我们在H5中对于图片的属性包含如下: object-fit属性有哪些值呢? object-fit: fill;  object-fit: contain;  object-fit: cover;  o ...

  2. 使用go-mysql-server 开发自己的mysql server

    go-mysql-server是一个golang 的mysql server 协议实现包,使用此工具我们可以用来做好多方便的东西 基于mysql 协议暴露自己的本地文件为sql 查询 基于mysql ...

  3. 二分法python实现

    聚会游戏,一个人想一个数,其他人来猜,然后告诉你猜大了还是小了,直到猜到这个数. 二分法和猜数游戏类似,只不过猜的时候一定猜最中间的那个数,折半查找所需内容,就数组来说,数组越长,梯度下降越快,二分查 ...

  4. SpringSecurity的简单入门

    以下是大体思路 1.导入坐标 <properties> <spring.version>4.2.4.RELEASE</spring.version> </pr ...

  5. automapper 源中有多个属性类映射到同一个 目标中

    CreateMap<TempBranchActivity, BranchActivityOutput>() .ConstructUsing((src, ctx) => ctx.Map ...

  6. rust 函数的使用

    fn main() { println!("Hello, world!"); another_function(2,3); let y ={ let x =3; //表达式的结尾没 ...

  7. 关于证书如何完成身份验证(SSL证书)

    一.写在前面 SSL和IPsec是现在VPN技术中最为常见的,在云计算的应用环境中,SSL更受企业青睐,至于原因的话简单的说就是SSL更为简洁,不需要像IPsec那样需要额外安装客户端,这会带来软件维 ...

  8. html5 css3 背景视频循环播放代码

    <div style ="position: absolute; z-index: -1; top: 0px; left: 0px; bottom: 0px; right: 0px; ...

  9. 剑指offer:丑数

    题目描述: 把只包含质因子2.3和5的数称作丑数(Ugly Number).例如6.8都是丑数,但14不是,因为它包含质因子7. 习惯上我们把1当做是第一个丑数.求按从小到大的顺序的第N个丑数. 解题 ...

  10. plsql查询数据库-中文显示问号问题

    解决方法: 设置本地环境变量 :NLS_LANG=AMERICAN_AMERICA.ZHS16GBK https://blog.csdn.net/github_38358734/article/det ...