为了账号安全,请及时绑定邮箱和手机立即绑定

java的实现内部类实现链表

标签:
Java


链表:依靠引用传递关系实现多个数据保存。

链表的常规实现:

复制代码

1 public class Node {2     String data;3     Node next;4     public Node(String data){5         this.data = data;6     }7 }

复制代码

实现增、删、查、改:

为了对链表实现保护,将链表进行内部私有化实现:

增加数据:

count : 增加数据的标记

foot : 遍历链表的角标

复制代码

    private class Node {        private String data;// save data
        private Node next;// Save the data of the next node

        public Node(String data) {// Contractor
            this.data = data;
        }        public void addNode(Node temp) {// add node by recursive
            if (this.next == null)                this.next = temp;            else
                this.next.addNode(temp);
        }

    }    private Node root;    private int count = 0;    private int foot;// index of node

    public void add(String str) {
        Node node = new Node(str);// crate new node
        if (this.root == null)            this.root = node;// root no node exists
        else
            this.root.addNode(node);// root node exists
        count++;
    }    public void print() {        if (count == 0)
            System.out.println("Current List is null");
        Node temp = root;        while (temp != null) {
            System.out.print(temp.data + " ");
            temp = temp.next;
        }
    }

复制代码

测试:

我的外部类为ListNode

复制代码

// for test
    public static void main(String[] args) {
        ListNode listNode = new ListNode();
        listNode.add("a");
        listNode.add("b");
        listNode.add("c");
        listNode.add("d");
        listNode.print();
    }

复制代码

输出为:a b c d 

 

链表的长度:

当前列表的长度和是否为空都可以通过count进行判断(在ListNode内)。

复制代码

    public int getLength() {        return count;
    }    public boolean isEmpty() {        return count == 0;
    }

复制代码

判断数据是否存在:

判断数据是否存在需要到Node类里面去查找。

在ListNode内:

    public boolean contains(String str) {        if (str == null || count == 0)            return false;        return root.containsNode(str);
    }

在Node类里面:

复制代码

        public boolean containsNode(String str) {            if (str.equals(this.data))// The data of the current node is the data to be found.
                return true;// base case
            if (this.next != null)// Find in subsequent nodes
                return this.next.containsNode(str);            return false;
        }

复制代码

 

取得链表中index位置的数据(重要):

在ListNode内:

复制代码

    public String getData(int index) {        if (count < index)            return null;
        foot = 0;        return root.getNodeData(index);
    }

复制代码

在Node类里面:

        public String getNodeData(int index) {            if (ListNode.this.foot++ == index)// The current node is the target
                return this.data;// base case
            return this.next.getNodeData(index);// Find in subsequent nodes
        }

 

测试:

复制代码

// for test
    public static void main(String[] args) {
        ListNode listNode = new ListNode();
        listNode.add("a");
        listNode.add("b");
        listNode.add("c");
        listNode.add("d");
        System.out.println(listNode.getLength());
        System.out.println(listNode.getData(3));
        System.out.println(listNode.contains("a"));
        System.out.println(listNode.isEmpty());
        listNode.print();
    }

复制代码

输出:

?

123454dtruefalsea b c d

 

变更数据:

变更数据和之前的查询操作类似。

在ListNode内:

复制代码

    public void setData(int index, String data) {        if(this.count < index){
            System.out.println("Exceeding the length of List!");            return;
        }        this.foot = 0;        this.root.setDataNode(index, data);
    }

复制代码

 

在Node内:

复制代码

        public void setDataNode(int index, String data) {            if (ListNode.this.foot++ == index)// The current node is the target
                this.data = data;// base case
            else// important
                this.next.setDataNode(index, data);
        }

复制代码

 

删除在index出的数据:

在Node内:

复制代码

        public void removeIndexNode(Node pervious, int index){            if (ListNode.this.foot++ == index){// The current node is the target
                pervious.next = this.next;// base case            }            else{                this.next.removeIndexNode(this, index);
            }
        }

复制代码

在ListNode内:

复制代码

    public void removeIndex(int index){        if(this.count < index){
            System.out.println("Exceeding the length of List!");            return;
        }        if(index == 0){// remove top node
            this.root = this.root.next;// Clear current node
            return;
        }        this.foot = 1;        // Judging from the second element
        this.root.next.removeIndexNode(this.root, index);        this.count--;
    }

复制代码

 

注意,起初在这儿的时候卡了,传进去原链表才能对其进行修改。如果是按照数据进行删除数据类似的写就行。

 

链表转为数组:

在ListNode内:

复制代码

    public String[] toArray(){
        String[] strings = new String[count];        if (this.count == 0){
            System.out.println("Current List is null");            return null;
        }
        Node temp = root;        int i = 0;        while (temp != null) {
            strings[i] = temp.data;
            i++;//            System.out.print(temp.data + " ");
            temp = temp.next;
        }        return strings;
    }

复制代码

链表转数组和打印链表类似。

 

测试:

复制代码

// for test
    public static void main(String[] args) {
        ListNode listNode = new ListNode();        for (int i = 0; i <= 5; i++)
            listNode.add(i + "");

        listNode.print();
        System.out.println();

        listNode.setData(1, "7");
        listNode.print();
        System.out.println();

        listNode.removeIndex(2);
        listNode.print();
        System.out.println();

        String[] strings = listNode.toArray();
        System.out.println(Arrays.toString(strings));
    }

复制代码

输出:

0 1 2 3 4 5 
0 7 2 3 4 5 
0 2 3 4 5 [0, 2, 3, 4, 5]


原文出处

点击查看更多内容
1人点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消