zoukankan      html  css  js  c++  java
  • 链表

    一种常见的基本数据结构,是一种线性表,但是并不会按线性的顺序存储数据,而是在每一个节点里存到下一个节点的指针(Pointer)。

    链表与数组:线性数据结构

    数组适合查找,遍历,固定长度

    链表适合插入,删除,不宜过长,否则导致遍历性能下降

    public class Test05 {
        public static void main(String[] args) {
            NodeManager n = new NodeManager();
            n.add(5);
            n.add(4);
            n.add(3);
            n.add(2);
            n.add(1);
            n.print();
            System.out.println("-----del----");
            n.del(3);
            n.print();
            System.out.println("----find-----");
            System.out.println(n.find(1));
            System.out.println("-------update------");
            n.update(1, 10);
            n.print();
            System.out.println("-------insert------");
            n.insert(1, 20);
            n.print();
        }
    }
    //谁有数据谁提供方法
    class NodeManager{
        private Node root;//根节点
        private int currentIndex = 0;//节点的序号,每次操作从0开始
        
        public void add(int data) {
            if(root == null) {
                root = new Node(data);
            }else {
                root.addNode(data);
            }
        }
        //删除
        public void del(int data) {
            if(root == null) return;
            if(root.getData() == data) {
                root = root.next;
            }else {
                root.delNode(data);
            }
        }
        //打印所有
        public void print() {
            
            if(root != null) {
                System.out.println(root.getData()+"->");
                root.printNode();
                System.out.println();
            }
        }
        //查找是否存在节点
        public boolean find(int data) {
            if(root == null) return false;
            if(root.getData() == data) {
                return true;
            }else {
                return root.findNode(data);
            }
            
        }
        public boolean update(int oldData, int newData) {
            if(root == null) return false;
            if(root.getData() == oldData) {
                root.setData(newData);
                return true;
            }else {
                return root.updateNode(oldData, newData);
            }
            
        }
        //向索引之前插入
        public void insert(int index, int data) {
            if(index < 0) return;
            currentIndex = 0;
            if(index == currentIndex) {
                Node newNode = new Node(data);
                newNode.next = root;
                root = newNode;
            }else {
                root.insertNode(index, data);
            }
        }
        private class Node{
            private int data;
            private Node next;//当前类型作为属性
            public Node(int data) {
                this.data = data;
            }
            public void setData(int data) {
                this.data = data;
            }
            public int getData() {
                return data;
            }
            //添加节点
            public void addNode(int data) {
                if(this.next == null) {
                    this.next = new Node(data);
                }else {
                    this.next.addNode(data);
                }
            }
            //删除节点
            public void delNode(int data) {
                if(this.next != null) {
                    if(this.next.data == data) {
                        this.next = this.next.next;
                    }else {
                        this.next.delNode(data);
                    }
                }
            }
            //输出所有节点
            public void printNode() {
                if(this.next != null) {
                    System.out.println(this.next.data + "->");
                    this.next.printNode();
                }
            }
            //查找节点是否存在
            public boolean findNode(int data) {
                if(this.next != null) {
                    if(this.next.data == data) {
                        return true;
                    }else {
                        return this.next.findNode(data);
                    }
                }
                return false;
            }
            //修改节点
            public boolean updateNode(int oldData, int newData) {
                if(this.next != null) {
                    if(this.next.getData() == oldData) {
                        this.next.data = newData;
                        return true;
                    }else {
                        return this.next.updateNode(oldData, newData);
                    }
                }
                return false;
            }
            //插入节点
            public void insertNode(int index, int data) {
                currentIndex++;
                if(index == currentIndex) {
                    Node newnNode = new Node(data);
                    newnNode.next = this.next;
                    this.next = newnNode;
                }else {
                    this.next.insertNode(index, data);
                }
            }
        }
    }
  • 相关阅读:
    LeetCode OJ String to Integer (atoi) 字符串转数字
    HDU 1005 Number Sequence(AC代码)
    HDU 1004 Let the Balloon Rise(AC代码)
    HDU 1003 Max Sum(AC代码)
    012 Integer to Roman 整数转换成罗马数字
    011 Container With Most Water 盛最多水的容器
    010 Regular Expression Matching 正则表达式匹配
    007 Reverse Integer 旋转整数
    006 ZigZag Conversion
    005 Longest Palindromic Substring 最长回文子串
  • 原文地址:https://www.cnblogs.com/happystudyhuan/p/10726131.html
Copyright © 2011-2022 走看看