JAVA—修改链表

修改链表:

链表不能实现操作数据的统一,所以就造成了每一次使用链表是都需要重复开发。但由于Object类型可以接收所有的引用数据类型,利用这样的特性就可以弥补之前链表设计的参数不统一问题,也就可以开发出真正的可重用链表操作。

完整代码:
class Link {
    private class Node {
        private Object data ;
        private Node next ;
        public Node(Object data) {
            this.data = data ;
        }
        public void addNode(Node newNode) {
            if (this.next == null) {
                this.next = newNode ;
            }else {
                this.next.addNode(newNode);
            }
        }
        public boolean containsNode(Object data) {
            if (data.equals(this.data)) {
                return true ;
            }else {
                if (this.next != null) {
                    return this.next.containsNode(data) ;
                }else{
                    return false ;
                }
            }
        }
        public Object getNode(int index) {
            if (Link.this.foot++ == index) {
                return this.data ;
            }else{
                return this.next.getNode(index) ;
            }
        }
        public void setNode(int index,Object data) {
            if(Link.this.foot++ == index) {
                this.data = data ;
            }else {
                this.next.setNode(index,data);
            }
        }
        public void removeNode(Node previous,Object data) {
            if (data.equals(this.data)) {
                previous.next = this.next ;
            } else {
                this.next.removeNode (this,data);
            }
        }
        public void toArrayNode() {
            Link.this.retArray[Link.this.foot++] = this.data ;
            if (this.next !=null){
                this.next.toArrayNode();
            }
        }
    }
    private Node root ;
    private int count = 0 ;
    private int foot = 0 ;
    private Object [] retArray ;

    public void add(Object data) {
        if (data == null) {
            return ;
        }
        Node newNode = new Node(data) ;
        if (this.root == null) {
            this.root = newNode ;
        } else {
            this.root.addNode(newNode);  
        }
        this.count ++ ;
    }
    public int size() {
        return this.count ;
    }
    public boolean isEmpty() {
        return this.count == 0 ;
    }
    public boolean contains(Object data) {
        if (data == null || this.root == null) {
            return false ;
        }
        return  this.root.containsNode(data) ;
    }
    public Object get(int index) {
        if (index > this.count) {
            return null ;
        }
        this.foot = 0 ;
        return this.root.getNode(index) ;
    }
    public void set(int index , Object data) {
        if (index > this.count) {
            return ;
        }
        this.foot = 0 ;
        this.root.setNode(index,data);
    }
    public void remove(Object data) {
        if (this.contains(data)) {
            if (data.equals(this.root.data)) {
                this.root = this.root.next ;
            }else {
                this.root.next.removeNode(this.root,data);
            }
            this.count -- ;
        }
    }
    public  Object[] toArray() {
        if (this.root == null) {
            return null ;
        }
        this.foot = 0 ;
        this.retArray = new Object[this.count] ;
        this.root.toArrayNode();
        return this.retArray ;
    }
    public clear() {
        this.root = null ;
        this.count = 0 ;
    }
}
分步解释:
1.
1.class Link {
2.    private class Node {
3.       private Object data ;
4.        private Node next ;
5.        public Node(Object data) {
6.           this.data = data ;
        }

1.创建一个链表类,外部只能看见这个类。
2.定义内部节点类。
3.data表示要保存的数据。
4.表示下一个节点的引用。(其实我觉得这里就像C语言的链表中的next指针)
5.每一个Node类对象都必须保存相应的数据。

2.
1. public void addNode(Node newNode) {
2.            if (this.next == null) {
3.                this.next = newNode ;
4.            }else {
5.                this.next.addNode(newNode);
6.            }
7.       }

1.定义一个增加节点的方法。
2.判断:如果当前节点的下一节点为null。
3.保存节点。
4.否则。
5.向后继续保存。

3.
1. public boolean containsNode(Object data) {
2.            if (data.equals(this.data)) {
3.                return true ;
4.            }else {
5.                if (this.next != null) {
6.                    return this.next.containsNode(data) ;
7.                }else{
8.                    return false ;
9.                }
            }
        }

1.定义一个返回值为布尔型的查询方法。
2.判断当前节点数据是否为要查询的数据。
3.如果是,则返回true。
4.否则(当前节点数据不满足查询要求)
5.判断:是否有后续节点,如果有后续节点。
6.这里是一个递归,我们使用递归调用继续查询。
7.如果没有后续节点。
8.则没有查询到,返回false。

4.
1. public Object getNode(int index) {
2.            if (Link.this.foot++ == index) {
3.                return this.data ;
4.            }else{
5.                return this.next.getNode(index) ;
6.            }
        }

1.定义一个方法:使用当前内容与要查询的索引进行比较,随后foot的内容自增。
2.判断当前要查询的索引。
3.如果相等,则返回当前节点数据。
4.否则,继续向后查询。
5.对下一个节点进行判断。

5.
1. public void setNode(int index,Object data) {
2.            if(Link.this.foot++ == index) {
3.                this.data = data ;
4.            }else {
5.                this.next.setNode(index,data);
6.            }
7.        }

1.定义一个方法:使用当前内容与要查询的索引进行比较,随后foot的内容自增。
2.判断当前要修改的索引。
3.如果相等,则进行内容的修改。
4.否则,继续向后查询。
5.对下一个节点进行判断。

6.
1. public void removeNode(Node previous,Object data) {
2.            if (data.equals(this.data)) {
3.                previous.next = this.next ;
4.            } else {
5.                this.next.removeNode (this,data);
6.            }
7.        }

1.定义一个删除的方法。
2.判断当前节点是否为要删除节点。
3.如果是。则空出当前节点。
4.否则,继续向后查询。
5.继续下一个判断。

7.
1. public void toArrayNode() {
2.            Link.this.retArray[Link.this.foot++] = this.data ;
3.            if (this.next !=null){
4.                this.next.toArrayNode();
5.            }
6.        }
7.    }

1.定义一个取得元素的方法。
2.取出数据并保存在数组中。
3.判断是否有后续元素。
4.如果有则继续下一个元素的取得。

8.
1.	  private Node root ;
2.    private int count = 0 ;
3.    private int foot = 0 ;
4.    private Object [] retArray ;

1.定义根节点。
2.count表示保存元素的个数。
3.foot表示节点索引。
4.表示返回的数组。

9.
1.public void add(Object data) {
2.        if (data == null) {
3.            return ;
4.        }
5.        Node newNode = new Node(data) ;
6.        if (this.root == null) {
7.            this.root = newNode ;
8.        } else {
9.            this.root.addNode(newNode);
10.        }
11.       this.count ++ ;
    }

1.定义一个增加数据的方法。
2.判断数据是否为空。
3.如果为空,则结束方法调用。
4.表示要保存的数据。
5.判断当前有无根节点。
6.如果没有,则保存根节点。
8.否则交给Node类处理节点的保存。
11.数据保存后保存个数加一。

10.
 public int size() {
        return this.count ;
    }

取得保存的数据量。

11.
public boolean isEmpty() {
        return this.count == 0 ;
    }

判断是否为空链表,表示长度为0,不是null。

12.
1. public boolean contains(Object data) {
2.        if (data == null || this.root == null) {
3.            return false ;
4.        }
5.        return  this.root.containsNode(data) ;
6.    }

1.定义一个判断指定数据是否存在的方法。
2.如果限制没有要查询的数据,根节点也不保存数据。
3.则没有查询结果。
5.否则交给Node类查询。

13.
1. public Object get(int index) {
2.        if (index > this.count) {
3.            return null ;
4.        }
5.        this.foot = 0 ;
6.        return this.root.getNode(index) ;
7.    }

1.定义一个根据索引取得保存的节点数据的方法。
2.判断如果超过了查询范围。
3.则返回null。
5.表示从前向后查询。
6.查询过程交给Node类。

14.
1.public void set(int index , Object data) {
2.        if (index > this.count) {
3.            return ;
4.        }
5.        this.foot = 0 ;
6.        this.root.setNode(index,data);
7.    }

1.定义一个根据索引修改数据的方法。
2.判断如果超过了保存范围。
3.若果是,则结束方法调用。
5.重新设置foot属性的内容,作为索引出现。
6.交给Node类设置数据内容。

15.
 1.public void remove(Object data) {
 2.       if (this.contains(data)) {
 3.           if (data.equals(this.root.data)) {
 4.               this.root = this.root.next ;
 5.           }else {
 6.               this.root.next.removeNode(this.root,data);
 7.           }
 8.           this.count -- ;
 9.       }
    }

1.定义一个根据索引删除数据的方法。
2.判断数据是否存在。
3.判断根节点数据是否为要删除数据。
4.如果是,则空出当前根节点。
6.否则从第二个元素开始判断,即第二个元素的上一个元素为根节点。
8.删除成功后个数要减少。

16.
1.public  Object[] toArray() {
2.        if (this.root == null) {
3.            return null ;
4.        }
5.        this.foot = 0 ;
6.       this.retArray = new Object[this.count] ;
7.        this.root.toArrayNode();
8.        return this.retArray ;
9.    }

1.定义一个将链表中的数据转换为对象数组输出的方法
2.判断该链表是否有数据
3,如果没有则返回null。
5.脚标清零操作。
6.根据保存内容开辟数组。
7.交给Node类处理
8.返回数组对象。

17.
public clear() {
        this.root = null ;
        this.count = 0 ;
    }

清空链表数据。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值