单链表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]);
        }
    }
}

 




posted @ 2019-07-14 13:09  修仙小华  阅读(193)  评论(0编辑  收藏  举报