手写简单的linkedlist

本文意在了解链表的简单的原理。知道增删查是什么情况;所有的不易立即理解的或者是需要注意都在代码中注释好了

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     }

输出:

原文地址:https://www.cnblogs.com/zyzblogs/p/11189109.html