• 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();
        }

    输出:

    4
    d
    true
    false
    a 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]
  • 相关阅读:
    观光奶牛Sightseeing Cows (二分+spfa(dfs))
    卢卡斯定理学习笔记
    分层图学习笔记
    热烈祝贺CRMEB运营中心乔迁新址
    CRMEB知识付费系统v1.2发布上线直播带课功能
    推荐一款超好用码云start超4.9k采用前后端分离开发的小程序商城源码
    crmeb打通版3.x小程序商城公众号重复无限刷新登陆解决
    如何利用CRMEB 3.2打通版小程序商城做直播带货
    crmeb打通版开源微信公众号小程序商城框架源码
    一文读懂知识付费平台的运营方向及平台选择
  • 原文地址:https://www.cnblogs.com/fengxilee/p/9372586.html
Copyright © 2020-2023  润新知