本文意在了解链表的简单的原理。知道增删查是什么情况;所有的不易立即理解的或者是需要注意都在代码中注释好了
Node类
1 package com.example.demo.collection.linkedlist; 2 3 /** 4 * 文件名:Node 5 * 作 者:Miles zhu 6 * 时 间:2019/7/15 14:19 7 * ------------------------- 8 * 功能和描述: 9 **/ 10 public class Node { 11 //下一个节点 12 private Node nextNode; 13 //上一个节点 14 private Node preNode; 15 //节点的值 16 private Object value; 17 18 public Node(Object value){ 19 super(); 20 this.value = value; 21 } 22 23 public Node getNextNode() { 24 return nextNode; 25 } 26 27 public void setNextNode(Node nextNode) { 28 this.nextNode = nextNode; 29 } 30 31 public Node getPreNode() { 32 return preNode; 33 } 34 35 public void setPreNode(Node preNode) { 36 this.preNode = preNode; 37 } 38 39 public Object getValue() { 40 return value; 41 } 42 43 public void setValue(Object value) { 44 this.value = value; 45 } 46 }
MyLinkedList
1 package com.example.demo.collection.linkedlist; 2 3 /** 4 * 文件名:MyLinkedList 5 * 作 者:Miles zhu 6 * 时 间:2019/7/15 14:22 7 * ------------------------- 8 * 功能和描述: 9 **/ 10 public class MyLinkedList { 11 //第一个节点 12 private Node first; 13 //最后一个节点 14 private Node last; 15 //linkedlist的长度 16 private int size; 17 18 public int size() { 19 return this.size; 20 } 21 22 //添加元素 23 public void add(Object value) { 24 Node node = new Node(value); 25 //linkelist中没有任何节点,那当天添加的就为第一个节点 26 if (null == first) { 27 first = node; 28 } else { 29 //原来是有节点的,那么久默认在最后添加节点 30 //把新添加的节点设置为原来最后一个节点的下一个节点 31 last.setNextNode(node); 32 //把原来的最后一个节点设置为新添加节点的上一个节点 33 node.setPreNode(last); 34 } 35 //将当前新添加的节点赋值给该链表的最后一个节点,作为新的最后一个节点 36 last = node; 37 size++; 38 } 39 40 //在指定的索引位置添加元素 41 public void add(int index, Object value) { 42 Node node = new Node(value); 43 /******在头部添加节点*******/ 44 if (0 == index) { 45 //将新的节点设置为原来的linkedlist的第一个节点的上一个节点 46 first.setPreNode(node); 47 //将原来linkedlist的第一个节点设置为新添加的节点的下一个节点 48 node.setNextNode(first); 49 //不要忘记将新添加的节点设置为linkedlist的第一个节点 50 first = node; 51 } else if (size == index) { 52 /******在尾部添加节点*******/ 53 //将新添加的节点设置到原来的linkedlist的最后一个节点的下一个节点 54 last.setNextNode(node); 55 //将原来的linkedlist的最后一个节点设置为新添加的节点的上一个节点 56 node.setPreNode(last); 57 //不要忘记将当前的节点赋值给linkedlist的最后一个节点 58 last = node; 59 } else { 60 /******在中间部分添加节点*******/ 61 //将原来的第一个节点保存起来 62 Node tmp = first; 63 //要添加的位置的上一个节点找到了 64 for (int i = 0; i < index - 1; i++) { 65 //从第一个节点开始找,一直找到index-1位置的节点的下一个节点元素,即index对应位置的节点元素 66 tmp = tmp.getNextNode(); 67 } 68 //该节点的下一个节点 69 Node nextNode = tmp.getNextNode(); 70 /** 71 * 想要看明白以下四步,想理清楚一个问题: 72 * tmp是什么值:tmp就是需要插入的索引位置的上一个索引位置的节点; 73 * 例如index=2,index-1=1;i<1 那么最后tmp.getNextNode()其实就是index=1位置的节点元素 74 * 因此node的值其实就是tmp的nextNode,而node的preNode自然而然就是tmp了 75 * 还有一点就是node的nextNode其实就是tmp的原来的nextNode(在插入新的节点之前,tmp的nextNode就是现在node的nextNode) 76 * 那么最后一点就是tmp的原来的nextNode的proNode就是node 77 * --------在2 位置添加节点,也就是说原来的2 的位置的节点需要往后移动,那么原来的1 位置的nextNode就是newNode,newNode的上一个节点就是1 位置; 78 * 原来的2位置的上一个节点就是newNode,newNode的下一个节点就是原来的2位置 79 * 80 */ 81 //将node设置为temp的下一个节点 82 tmp.setNextNode(node); 83 //将tmp设置为新节点的上一个节点 84 node.setPreNode(tmp); 85 //将tmp原来的下一个节点设置为新的节点的下一个节点 86 node.setNextNode(nextNode); 87 //将node设置为tmp原来的下一个节点的上一个节点 88 nextNode.setPreNode(node); 89 } 90 //linkedlist的长度++ 91 size++; 92 } 93 94 public Object get(int index) { 95 if (0 == index) { 96 return first.getValue(); 97 } 98 Node tmp = first; 99 for (int i = 0; i < index; i++) { 100 tmp = tmp.getNextNode(); 101 } 102 return tmp.getValue(); 103 } 104 105 public void remove(int index){ 106 if(0 ==index){ 107 first = first.getNextNode(); 108 first.setPreNode(null); 109 }else if(size - 1 == index){ 110 last = last.getPreNode(); 111 last.setNextNode(null); 112 }else{ 113 Node tmp = first; 114 for (int i = 0; i < index; i++) { 115 tmp = tmp.getNextNode(); 116 } 117 Node preNode = tmp.getPreNode(); 118 Node nextNode = tmp.getNextNode(); 119 preNode.setNextNode(nextNode); 120 nextNode.setPreNode(preNode); 121 // 别忘记,不设置为null对象是不会被回收的,容易造成内存泄漏 122 tmp = null; 123 } 124 size --; 125 } 126 127 128 }
测试一波
1 public static void main(String[] args) { 2 MyLinkedList myLinkedList = new MyLinkedList(); 3 myLinkedList.add("旺财"); 4 myLinkedList.add("你醒醒啊"); 5 for (int i = 0; i < myLinkedList.size(); i++) { 6 Object o = myLinkedList.get(i); 7 System.out.println(o); 8 } 9 }
输出: