zoukankan      html  css  js  c++  java
  • java实现链表

      单链表

      1 package com.voole.linkedlist;
      2 
      3 public class Test {
      4     public static void main(String[] args) {
      5         LinkedList linkedList = new LinkedList();
      6         linkedList.insert(new Node(null, null));
      7         linkedList.insert(new Node(null, null));
      8         linkedList.insert(new Node(null, null));
      9         linkedList.insert(new Node(null, null));
     10         linkedList.insert(new Node(null, null));
     11         linkedList.insert(new Node(null, null),2);
     12         Node node = new Node(null, null);
     13         linkedList.update(node,2);
     14         System.out.println(linkedList.select(2));
     15         System.out.println(node);
     16     }
     17 }
     18 
     19 
     20 package com.voole.linkedlist;
     21 /**
     22  * 链表类(单链表)
     23  * @author TMAC-J
     24  *
     25  */
     26 public class LinkedList {
     27     /**
     28      * 定义头结点
     29      */
     30     private Node head = null;
     31     /**
     32      * 定义链表长度
     33      */
     34     private int size = 0;
     35     /**
     36      * 定义指针,当为0时,代表指向头结点
     37      */
     38     private int point = 0;
     39     /**
     40      * 构造方法
     41      */
     42     public LinkedList(){
     43         head = new Node(null, null);//初始化头结点
     44     }
     45     /**
     46      * 增(在末尾)
     47      */
     48     public void insert(Node node){
     49         Node currentNode = null;
     50         while(point!=size){
     51             if(point == 0){
     52                 currentNode = head.next; 
     53             }
     54             else{
     55                 currentNode = currentNode.next;
     56             }
     57             point++;
     58         }
     59         /**
     60          * if-else防止currentNode.next的空指针异常
     61          */
     62         if(currentNode!=null){
     63             currentNode.next = node;
     64         }
     65         else{
     66             head.next = node;
     67         }
     68         point = 0;//将指针指向头结点
     69         size++;
     70         LinkedListLog.getInstance().insert();
     71     }
     72     /**
     73      * 增(在任意位置)
     74      */
     75     public void insert(Node node,int position){
     76         checkPosition(position);
     77         Node currentNode = null;
     78         while(point!=position-1){
     79             if(point == 0){
     80                 currentNode = head.next; 
     81             }
     82             else{
     83                 currentNode = currentNode.next;
     84             }
     85             point++;
     86         }
     87         if(currentNode!=null){
     88             node.next = currentNode.next;
     89             currentNode.next = node;
     90         }
     91         else{
     92             head.next = node;
     93         }
     94         point = 0;//将指针指向头结点
     95         size++;
     96         LinkedListLog.getInstance().insert();
     97     }
     98     /**
     99      * 删
    100      */
    101     public void delete(int position){
    102         checkPosition(position);
    103         Node currentNode = null;
    104         while(point!=position-1){
    105             if(point == 0){
    106                 currentNode = head.next; 
    107             }
    108             else{
    109                 currentNode = currentNode.next;
    110             }
    111             point++;
    112         }
    113         if(size == 1){
    114             currentNode.next = null;
    115         }
    116         else{
    117             currentNode.next = currentNode.next.next;
    118         }    
    119         point = 0;//将指针指向头结点
    120         size--;
    121         LinkedListLog.getInstance().delete();
    122     }
    123     /**
    124      * 改
    125      */
    126     public void update(Node node,int position){
    127         checkPosition(position);
    128         Node currentNode = null;
    129         while(point!=position-1){
    130             if(point == 0){
    131                 currentNode = head.next; 
    132             }
    133             else{
    134                 currentNode = currentNode.next;
    135             }
    136             point++;
    137         }
    138         if(size == 1){
    139             currentNode.next = node;
    140         }
    141         else{
    142             node.next = currentNode.next.next;
    143             currentNode.next = node;
    144         }
    145         point = 0;//将指针指向头结点
    146         LinkedListLog.getInstance().update();
    147     }
    148     /**
    149      * 查
    150      */
    151     public Node select(int position){
    152         checkPosition(position);
    153         Node currentNode = null;
    154         while(point!=position-1){
    155             if(point == 0){
    156                 currentNode = head.next; 
    157             }
    158             else{
    159                 currentNode = currentNode.next;
    160             }
    161             point++;
    162         }
    163         point = 0;
    164         return currentNode.next;
    165     }
    166     /**
    167      * 检查位置是否正确
    168      */
    169     public void checkPosition(int position){
    170         if(position>size+1||position<=0){
    171             LinkedListLog.getInstance().error();
    172             return;
    173         }
    174     }
    175 }
    176 
    177 package com.voole.linkedlist;
    178 /**
    179  * @description 链表节点
    180  * @author TMAC-J
    181  *
    182  */
    183 public class Node {
    184     /**
    185      * 定义指针域
    186      */
    187     public Node next = null;
    188     /**
    189      * 定义数据域
    190      */
    191     public Data data = null;
    192     /**
    193      * @description 构造方法
    194      */
    195     public Node(Node next,Data data){
    196         this.next = next;
    197         this.data = data;
    198     }
    199 }
    200 
    201 
    202 package com.voole.linkedlist;
    203 
    204 import java.io.Serializable;
    205 
    206 public class Data implements Serializable{
    207 
    208     /**
    209      * 
    210      */
    211     private static final long serialVersionUID = 1L;
    212 
    213 }
    214 
    215 
    216 package com.voole.linkedlist;
    217 /**
    218  * 单例日志类(饿汉)
    219  * @author TMAC-J
    220  *
    221  */
    222 public class LinkedListLog {
    223     private static final LinkedListLog instance = new LinkedListLog();
    224     
    225     private LinkedListLog(){}
    226     
    227     public static LinkedListLog getInstance(){
    228         return instance;
    229     }
    230     
    231     public void insert(){
    232         System.out.println("插入成功!");
    233     }
    234     
    235     public void delete(){
    236         System.out.println("删除成功!");
    237     }
    238     
    239     public void update(){
    240         System.out.println("修改成功!");
    241     }
    242     
    243     public void select(){
    244         System.out.println("查询成功!");
    245     }
    246     
    247     public void error(){
    248         System.out.println("错误!");
    249     }
    250 }


    插入成功!
    插入成功!
    插入成功!
    插入成功!
    插入成功!
    插入成功!
    修改成功!
    com.voole.linkedlist.Node@7cb8f891
    com.voole.linkedlist.Node@7cb8f891

    以上就是java代码实现单链表的过程,注意,单链表的效率其实是很低的,读者看代码也可以知道,每一次操作都需要从表头开始遍历节点,更高的效率可以在此基础上改一部分,改成双链表,这样就可以从两头查询,并且可以进一步优化,让指针不用每一次都操作完都置为0,很多方式都可以提升效率,并且可以添加同步的方法提升安全性,在此,我就不去完善了,这里只是一个最基础功能的链表。



  • 相关阅读:
    STL 之 unordered_map
    vim tab和空格相互替换
    windows使用
    debugger打不开
    存储过程中执行动态Sql语句
    什么是详细设计说明书?
    C#中调用SQL存储过程(带输入输出参数的例子)
    如何解决网站在IE8下出现布局乱的情况?
    SQLServer 游标简介与使用说明
    线程池ThreadPoolExecutor参数设置
  • 原文地址:https://www.cnblogs.com/yzjT-mac/p/6093641.html
Copyright © 2011-2022 走看看