久染

导航

Java day17【第三十章】链表的定义与使用

【第三十章】链表的定义与使用

一.链表实现简介

所谓链表的实质性的本质是利用引用的逻辑关系来实现类似于数组的数据操作。

 

 二.数据增加

interface ILink<E>{
    public void add(E e);
}
class LinkImpl<E> implements ILink<E>{
    private class Node{
        private E date;
        private Node Next;
        public Node(E date){
            this.date = date;
        }
    }
}

  在定义的Node类中并没有出现有setter和getter方法,是因为内部类的私有属性也方便外部类直接使用。

范例:原始方法

interface ILink<E>{
    public void add(E e);
}
class LinkImpl<E> implements ILink<E>{
    private class Node{        //新建一个节点类
        private E date;        //保存的数据
        private Node next;    //保存下一个引用节点
        public Node(E date){    //有数据
            this.date = date;
        }
        public void addNode(Node newNode){
            if(this.next == null){
                this.next = newNode;
            }else{
                this.next.addNode(newNode);
            }
        }
    }
    //以下为Link类中定义的成员
    private Node root;        //定义表头的引用
    //以下为Link中定义的方法
    public void add(E e){
        if(e == null){
            return ;
        }
        //数据本身是不具有关联特性的,要想关联必须将数据封装在Node类中
        Node newNode = new Node(e);    //创建新的节点
        if (this.root == null){
            this.root = newNode;
        }else{
            this.root.next = newNode; 
        }
            
        }
    }
}
public class A 
{
    public static void main(String[] args) 
    {
        ILink<String> date = new LinkImpl<String>();
        date.add("GHE");
    }
}

范例:代码优化

interface ILink<E>{
    public void add(E date);
}
class SetLink<E> implements ILink<E>{
    private Node<E> root;
    public class Node<E>{
        private E date;
        private Node<E> next;
        public Node(E date ,Node<E> next){
            this.date = date;
            this.next = next;
        }
    }
    public void add(E date){
        if(root == null){
            root = new Node<E>(date,null);
        }else{
            Node<E> current = root;
            while(current.next != null){
                current = current.next ;
            }
            current.next = new Node<E>(date,null);
        }
    }
}
public class A 
{
    public static void main(String[] args) 
    {
        ILink<String> date = new SetLink<String>();
        date.add("GHE");
    }
}

 

三.获取链表长度:

    public int getsize() {
        return size;
    }

四.判断链表为空:

    public boolean isEmpty() {
        return this.size ==0;
    }
    public boolean isEmpty() {
        return this.root == null;
    }

五.返回集合数据:

interface ILink<E>{
    public void add(E date);
    public int getsize();
    public boolean isEmpty();
    public Object[] toArray();
}
class SetLink<E> implements ILink<E>{
    private int size;
    private Node<E> root;
    public Object [] returnDate;
private int foot ;
//定义节点类
    public class Node<E>{
        E date;
        Node<E> next;
        public Node(E date, Node<E> next) {
            this.date = date;
            this.next = next;
        }
        public void toArraynode() {
            SetLink.this.returnDate[SetLink.this.foot++] = this.date;
            if(next != null) {
                this.next.toArraynode();
            }
        }
    }
    
    //增加数据
    public void add(E date) {
        if(root == null) {
            root = new Node<E>(date , null);
        }else {
            Node<E> current = root;
            while(current.next != null) {
                current = current.next;
            }
            current.next = new Node<E>(date,null);
        }
        size ++;
    }
    
    //获取链表长度
    public int getsize() {
        return size;
    }
    
    //判断链表是否为空
    public boolean isEmpty() {
        return this.size ==0;
    }
    
    //将数据以数组形式返回

    public Object[] toArray() {
        if(root == null) {
            return null;
        }
        this.foot = 0;
        this.returnDate = new Object[this.size];
        this.root.toArraynode();
        return returnDate;
    }
}
public class ListCon{
    public static void main(String args[]) {
         ILink<String> msg = new SetLink<String>();
         System.out.println(msg.getsize());
         System.out.println(msg.isEmpty());
         msg.add("Tsy");
         msg.add("Tsz");
         msg.add("Tst");
         System.out.println(msg.getsize());
         Object results[] = msg.toArray();
         for(Object result : results) {
             System.out.println(result);
         }
    }
}

六.根据索引位置获取数据:

//辅助根据索引获取数据
public E getnode(int index) {
    if(SetLink.this.foot ++ == index) {
        return this.date;
    }else {
        return this.next.getnode(index);
    }
//获取索引位置的数据:
public E getdate(int index) {
    if(index > this.size) {
        return null;
    }
    this.foot = 0;
    return this.root.getnode(index);
}

七.修改指定索引位置的数据:

//找到索引位置.
public void setnode(int index,E date) {
    if(SetLink.this.foot == index) {
        this.date= date;
    }else {
        this.next.setnode(index,date);;
    }
}    
//修改指定位置的数据
public void set(int index , E date) {
    this.foot = 0;
    this.root.setnode(index,date) ;
}

 八.数据删除

考虑俩种情况:

 1.删除根节点

 2.删除不是根节点

           //删除节点
    public void removeNode(Node<E> previous,E date) {
        if(this.date.equals(date)) {
            previous.next = this.next;
        }else {
            if(this.next!=null) {
                this.next.removeNode(this,date);
            }
        }
    }
    //数据删除
    public void remove(E date) {
        if(this.contain(date)) {
            if(this.root.date.equals(date)) {
                this.root = this.root.next;
            }else {
                this.root.next.removeNode(this.root, date);
            } 
            this.size--;
        }
    }    

 

九.清空链表:

    public void clean() {
        this.root = null ;
        this.size = 0;
    }

 

posted on 2019-11-08 09:48  久染  阅读(271)  评论(0编辑  收藏  举报