zoukankan      html  css  js  c++  java
  • 单链表java实现及相关操作(版本3)

       版本3将采用内部类的方式实现单链表,这样有两大好处,第一:封装;第二:更加贴合面向对象的思想。在链表类Link里面定义一个Node结点类,Node负责创建结点并且执行结点内部的相关操作,链表类负责执行对结点的相关操作。代码如下:

    Link类:

      1 import java.net.Inet4Address;
      2 /**
      3  *这是一个链表类,结点类写在链表类的内部就更加贴合面向对象的思想(链表是由一个个结点组成的),这个类的作用是操作结点,
      4  *定义了操作结点的一些方法
      5  */
      6 public class Link {
      7     
      8     private Node root;//设置头结点,头指针存放的下一个结点的地址
      9     private int count=0;//用于计算链表长度
     10     private int index=0;//定义的下标
     11     private String[] returnArray;//定义一个数组用来输出链表数据
     12     
     13     public String[] toArray() {
     14         if (this.root==null) {
     15             return null;
     16         }
     17         this.index=0;
     18         this.returnArray=new String[this.count];
     19         this.root.toArrayNode();
     20         return this.returnArray;
     21     }
     22     
     23     //删除方法
     24     public  void remove(String data) {
     25         if (this.contains(data)) {
     26             if (data.equals(this.root.data)) {
     27                 this.root=this.root.next;
     28             }
     29         }else {
     30             this.root.next.removeNode(this.root, data);
     31             //此时下一个结点的上一个节点就是this。root
     32         }this.count--;
     33     }
     34     
     35     //修改方法
     36     public void set(int index,String data) {
     37         if(index>(this.count-1)||index<0) {
     38             return ;
     39         }
     40         this.index=0;
     41         this.root.setNode(index,data);
     42     }
     43 
     44     /**
     45      * *获取结点信息
     46      */
     47     public String get(int index) {
     48         if(index>(this.count-1)||index<0) {
     49             return null;
     50         }
     51         this.index=0;
     52         return this.root.getNode(index);
     53     }
     54 
     55     /**
     56      **设置指针结点方法
     57      */
     58     public void setIndex(int index) {
     59         this.index = index;
     60     }
     61     
     62     //返回链表长度
     63     public int size() {
     64         return this.count;
     65     }
     66     
     67     //判断链表是否为空
     68     public boolean isEmpty() {
     69         return this.count==0;
     70     }
     71     
     72     
     73     //调用结点类中的方法containsNode,根据传入的数据判断是否存在
     74     public boolean contains(String data) {
     75         if(data==null||this.root==null) {
     76             return false;
     77         }
     78         return this.root.containsNode(data);
     79     }
     80     
     81     public Link() {
     82     }
     83     //调用结点类中的方法增加结点
     84 
     85     //要注意增加结点这一块,是针对这一个结点的操作,所以只考虑这一个结点
     86     public void add(String data) {
     87         if(data==null) {
     88             return;
     89         }
     90         Node node=new Node(data);
     91         this.count++;//Node创建出来count就++
     92         
     93         if(this.root==null) {
     94             this.root=node;
     95         }else {
     96             this.root.addNode(node);
     97         }
     98         
     99     }
    100     
    101 
    102 //******************************************************************
    103     /**
    104      **这是一个结点类,这个类的作用是创建一个个结点
    105      */
    106     private class Node{
    107         private String data;
    108         private Node next;
    109         
    110         //有参构造
    111         public Node(String data) {
    112             this.data = data;
    113         }
    114         
    115         //无参构造
    116         public Node() {
    117         }
    118     
    119         
    120         /**
    121          * 将链表数据变成数组输出
    122          */
    123         public void toArrayNode() {
    124             Link.this.returnArray[Link.this.index++]=this.data;
    125             if (this.next!=null) {
    126                 this.next.toArrayNode();
    127             }
    128             
    129         }
    130 
    131         //第一次调用(link) previous=this.root;this=Link.root.next
    132         //第二次调用(Node) previous=this.root.next;this=Link.root.next.next.next
    133         public void removeNode (Node previous,String data) {
    134             if(this.data.equals(data)) {
    135                 previous.next=this.next;
    136                 
    137             }else {
    138                 this.next.removeNode(previous, data);//this.next的父节点就是this
    139             }
    140             
    141         }
    142         
    143         /**
    144          * *设置结点信息方法
    145          */
    146         public void setNode(int index, String data) {
    147             if(Link.this.index++ ==index) {
    148                  this.data=data;
    149             }else {
    150                 this.next.setNode(index,data);
    151                 }
    152         }
    153         
    154         /**
    155          ** 获取结点信息方法
    156          */
    157         public String getNode(int index) {
    158             if(Link.this.index++ ==index) {
    159                 return this.data;
    160             }else {
    161                 return this.next.getNode(index);
    162                 }
    163         }
    164         
    165         /**
    166          * *查找方法,判断数是否存在
    167          */
    168         public boolean containsNode(String data) {
    169             if(data.equals(this.data)) {
    170                 return true;
    171             }else {
    172                 if(this.next !=null) {
    173                     return this.next.containsNode(data);
    174                 }else {
    175                     return false;
    176                 }
    177             }
    178             
    179         }
    180         /**
    181          * 增加结点
    182          */
    183         //第一次调用(Link):this=Link.root
    184         //第二次调用(Node):this=Link.root.next
    185 
    186        //这里要重点理解指针,首先要明白指针是会移动的,当判断this.next是否为空的时候,指针已经移动到下一个结点了,next存放的是下一个结点的地址。
    187         public void addNode(Node node) {
    188             if(this.next==null) {
    189                 this.next=node;
    190             }else {
    191                 this.next.addNode(node);
    192             }
    193         }
    194         
    195         public String getData() {
    196             return data;
    197         }
    198         
    199         public void setData(String data) {
    200             this.data = data;
    201         }
    202     
    203         public Node getNext() {
    204             return next;
    205         }
    206         
    207         public void setNext(Node next) {
    208             this.next = next;
    209         }
    210     }
    211 }


    LinkeText类:

    package lianbiaoDemo03;
    
    public class LinkText {
    
        public static void main(String[] args) {
            Link link=new Link();
            link.add("葫芦娃1");
            link.add("葫芦娃2");
            link.add("葫芦娃3");
            link.add("葫芦娃4");
            link.add("葫芦娃5");
        //    System.out.println(link.size());
        //    System.out.println(link.isEmpty());
        //    System.out.println(link.contains("葫芦娃4"));
        //    System.out.println(link.get(1));
        //    link.set(1, "孙悟空");
        //    System.out.println(link.get(1));
        //    link.remove("葫芦娃3");
        //    System.out.println(link.get(2));
            String [] s=link.toArray();
            for (int i = 0; i < s.length; i++) {
                System.out.println(s[i]);
            }
        }
    }




  • 相关阅读:
    求欧拉回路的算法学习
    2020牛客暑期多校训练营(第六场 )C Combination of Physics and Maths(思维)
    2020牛客暑期多校训练营(第六场)E.Easy Construction(思维构造,附图解)
    CF1038D Slime(思维+枚举+贪心)(来自洛谷)
    CF1250B The Feast and the Bus(贪心+枚举)(来自洛谷)
    Codeforces Round #659 (Div. 2) A.Common Prefixes
    IDEA本人亲测可用的破解方法
    Codeforces Round #658 (Div. 2)(A,B博弈,C1,C2)
    2020牛客暑期多校训练营(第四场)B.Basic Gcd Problem(数学)
    2020牛客暑期多校训练营(第三场)B.Classical String Problem(思维)
  • 原文地址:https://www.cnblogs.com/had1314/p/11183972.html
Copyright © 2011-2022 走看看