zoukankan      html  css  js  c++  java
  • 手写简单的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     }

    输出:

  • 相关阅读:
    With在sql server 2005中的用法
    相互关联子查询在项目中的用法
    存储过程中@@Identity全局变量
    sql server 2008 5120错误
    如何启用 FILESTREAM
    表变量在存储过程或sql server中的运用
    Union ,Union ALL的用法
    数据移植(利用Ado.Net功能实现)
    Foreign Key ,NO action,Cascade的用法
    EXISTS 在SQL 中的用法
  • 原文地址:https://www.cnblogs.com/zyzblogs/p/11189109.html
Copyright © 2011-2022 走看看