• 台哥算法练习 自己写的一个LinkedList


    package suanfa;
    
    /**
     * 当年学习数据结构和算法的时候,自己写的一个LinkedList,
     * 可以看到,LinkedList是动态链表,插入和删除的效率比较高,查询其长度的效率比较低
     * 
     * 推荐一本学习数据结构和算法的书籍,《数据结构java版》清华大学出版社,译者梁志敏
     * 
     * @author 台哥  https://blog.csdn.net/chaohi
     * 
     * @param <T>
     */
    public class LinkedList<T> {
        private Node<T> node;
        private int listSize;
    
        // 构造方法
        public LinkedList() {
            node = new Node<T>();
            listSize = 0;
        }
    
        // 在索引index处添加元素
        public void add(int index, T element) {
            if (index < 0 || index > listSize) {
                return;
            }
            Node<T> preNode = node;
            for (int i = 0; i < index; i++)
                preNode = preNode.next;
            Node<T> newNode = new Node<T>(element);
            if (preNode.next != null) {
                preNode.next.prev = newNode;
                newNode.next = preNode.next;
            }
            newNode.prev = preNode;
            preNode.next = newNode;
            listSize++;
        }
    
        // 在尾部添加元素并返回true
        public boolean add(T element) {
            this.add(listSize, element);
            return true;
        }
    
        // 返回第一个element元素的索引
        public int indexOf(T element) {
            Node<T> curNode = node;
            for (int i = 0; i <= listSize - 1; i++) {
                curNode = curNode.next;
                if (curNode.equals(element))
                    return i;
            }
            return -1;
        }
    
        // 返回最后一个element元素的索引
        public int lastIndexOf(T element) {
            int index = -1;
            Node<T> curNode = node;
            for (int i = 0; i <= listSize - 1; i++) {
                curNode = curNode.next;
                if (curNode.equals(element))
                    index = i;
            }
            return index;
        }
    
        // 得到索引index处的节点
        public Node<T> getNode(int index) {
            Node<T> curNode = node;
            for (int i = 0; i <= index; i++) {
                curNode = curNode.next;
            }
            return curNode;
        }
    
        // 得到索引index处的元素
        public T get(int index) {
            if (index < 0 || index >= listSize) {
                return null;
            }
            return this.getNode(index).value;
        }
    
        // 为索引index处的元素赋值
        public T set(int index, T element) {
            if (index < 0 || index >= listSize) {
                return null;
            }
            T previousValue = this.get(index);
            Node<T> curNode = this.getNode(index);
            curNode.value = element;
            return previousValue;
        }
    
        // 删除索引index处的元素
        public T remove(int index) {
            if (index < 0 || index >= listSize) {
                return null;
            }
            Node<T> curNode = this.getNode(index);
            curNode.prev.next = curNode.next;
            if (curNode.next != null)
                curNode.next.prev = curNode.prev;
            listSize--;
            return curNode.value;
        }
    
        // 删除列表中的element元素
        public boolean remove(T element) {
            int index = this.indexOf(element);
            if (index != -1) {
                this.remove(index);
                return true;
            }
            return false;
        }
    
        // 返回列表的长度
        public int size() {
            return listSize;
        }
    
        // 判断列表是否为空
        public boolean isEmpty() {
            return listSize == 0;
        }
    
        // 清空列表
        public void clear() {
            node = null;
            listSize = 0;
        }
    
        // 判断列表中是否存在元素element
        public boolean contains(T element) {
            return !(this.indexOf(element) == -1);
        }
    
        // 节点
        @SuppressWarnings("hiding")
        private class Node<T> {
            public T value;
            public Node<T> prev;
            public Node<T> next;
    
            public Node() {
            };
    
            public Node(T t) {
                this.value = t;
            }
        }
    
        // 测试
        public static void main(String[] args) {
            LinkedList<String> l = new LinkedList<String>();
            l.add("台哥");
            l.add("taigecailing");
            l.add(1, "当当当当");
            System.out.println("size=:" + l.size());
    
            for (int i = 0; i < l.size(); i++) {
                System.out.print(l.get(i) + " , ");
            }
            System.out.println();
            
            l.remove(2);
            System.out.println(l.get(2));
        }
    
    }
     
  • 相关阅读:
    抓取到的网页写入数据库后是乱码的解决方法
    关于SecureCRT v7.0.2.418 安装、破解和修改
    负数的除法和取模运算(Python 2.7和C的比较)
    单模式匹配匹配算法
    Python解析网页工具:PyQuery
    asp.net json,对象,字符串的相互转换
    asp.net 后台 get,post请求
    查看局域网内所有IP
    MSSql性能优化
    js中对象复制以及apply方法的使用
  • 原文地址:https://www.cnblogs.com/chaohi/p/10698003.html
Copyright © 2020-2023  润新知