zoukankan      html  css  js  c++  java
  • 自定义线性结构-双链表方式

    /**
     * @desc: 双链表实现
     * @author: 毛会懂
     * @create: 2020-12-28 13:58:00
     **/
    public class MyDoubleLinkList<T> implements MyList<T> {
        //头指针
        private Node head;
        //尾指针(为了方便向链表末尾插入元素,也为了方便取最后一个元素,会多定义一个字段)
        private Node last;
        //元素数量
        private Integer count;
    
        public MyDoubleLinkList() {
            //默认指向空节点
            head = new Node(null,null,null);
            last = null;
            count = 0;
        }
    
        /**
        * 链表最后添加元素
        **/
        @Override
        public void add(T t) {
            if(count == 0){
                Node newNode = new Node(t,head,null);
                head.next = newNode;
                last = newNode;
            }else {
                Node newNode = new Node(t, last, null);
                last.next = newNode;
                last = newNode;
            }
            count++;
        }
    
        /**
        * 指定位置添加元素
        **/
        @Override
        public void add(Integer i, T t) {
          if(i < 0 || i > count){
              throw new RuntimeException("位置不正确");
          }
          //添加最后一个元素
          if(i == count){
              add(t);
              return;
          }
          //找到第i个位置的上一个元素
          Node preNode = head;
          for(int index = 0;index < i;index++){
              preNode = preNode.next;
          }
          //第i个元素
          Node cur = preNode.next;
          //构造新元素
          Node newNode = new Node(t,preNode,cur);
    
          preNode.next = newNode;
          cur.pre = newNode;
    
          count++;
        }
    
        /**
        * 移除指定位置的元素
        **/
        @Override
        public T remove(Integer i) {
            if(i < 0 || i >= count){
                throw new RuntimeException("下标超过范围");
            }
    
            if(count == 0){//没有元素
                return null;
            }
            Node pre = head; //查询第i个位置的前一个Node
            for(int index = 0; index <i;index++){
                pre = pre.next;
            }
            Node cur = pre.next; //当前Node
            Node next = cur.next; //当前的下一个Node
            if(next == null){ //移除的是最后一个元素
                pre.next = null;
                cur.pre = null;
                last = pre; //移除最后一个元素,需要重置last
            }else{ //不是最后一个元素
               pre.next = next;
               next.pre = pre;
            }
            count--;
    
            return cur.item;
        }
    
        /**
        * 更新指定位置的数据
        **/
        @Override
        public void update(int i, T t) {
            if(i < 0 || i >= count){
                throw new RuntimeException("下标超过范围");
            }
            Node cur = head;
            for(int index = 0; index <=i;index++){
                cur = cur.next;
            }
            cur.item = t;
        }
    
        @Override
        public T get(int i) {
            if(i < 0 || i >= count){
                throw new RuntimeException("下标超过范围");
            }
            Node cur = head.next;
            for(int index = 0;index <i;index++){
                cur = cur.next;
            }
            return cur.item;
        }
    
        /**
        * 查找元素
        **/
        @Override
        public Integer indexOf(T t) {
            if(count == 0){
                return null;
            }
            Node cur = head.next;
            for(int i = 0; i < count;i++){
                if(cur.item.equals(t)){
                    return i;
                }
                cur = cur.next;
            }
            return null;
        }
    
        @Override
        public Boolean isEmpty() {
            return count == 0;
        }
    
        @Override
        public Integer length() {
            return count;
        }
    
        @Override
        public void clean() {
            head = new Node(null,null,null);
            last = null;
            count = 0;
        }
    
        /**
        * 返回第一个元素
        **/
        public T getFirst(){
            if(isEmpty()){
                return null;
            }
            return head.next.item;
        }
    
        /**
         * 返回最后一个元素
         **/
        public T getLast(){
            if(isEmpty()){
                return null;
            }
            return last.item;
        }
    
        @Override
        public Iterator<T> iterator() {
            return new myIterator();
        }
    
        private class myIterator implements Iterator<T>{
            private Node node;
    
            public myIterator(){
                node = head;
            }
    
    
            @Override
            public boolean hasNext() {
                return node.next != null;
            }
    
            @Override
            public T next() {
                T t = node.next.item;
                node = node.next;
                return t;
            }
        }
    
        private class Node{
            //元素
            private T item;
            //指向上一个
            private Node pre;
            //指向下一个
            private Node next;
    
            public Node(T item, Node pre, Node next) {
                this.item = item;
                this.pre = pre;
                this.next = next;
            }
        }
    }
    public static void main(String[] args) {
    MyList<Integer> myList = new MyDoubleLinkList<>();
    myList.add(101);
    myList.add(0,100);
    System.out.println(myList.length());
    myList.forEach(System.out::println);
    System.out.println("--------");
    //删除
    Integer del = myList.remove(1);
    System.out.println("删除的元素:" +del);
    //更新
    myList.update(0,1000);
    for (Integer item : myList) {
    System.out.println(item);
    }
    System.out.println("-----------");
    myList.add(2000);
    myList.add(2,3000);
    System.out.println("get到的元素:" + myList.get(1));
    System.out.println("查找元素:" + myList.indexOf(1000));//1000的下标为0
    System.out.println("第一个元素:" + ((MyDoubleLinkList)myList).getFirst());
    System.out.println("最后一个元素:" + ((MyDoubleLinkList)myList).getLast());
    myList.clean();

    }
  • 相关阅读:
    环境是如何建立的 启动文件有什么
    环境中存储的是什么
    串行 并行 异步 同步
    TPC-H is a Decision Support Benchmark
    进程通信类型 管道是Linux支持的最初Unix IPC形式之一 命名管道 匿名管道
    删除环境变量
    14.3.2.2 autocommit, Commit, and Rollback 自动提交 提交和回滚
    14.3.2.2 autocommit, Commit, and Rollback 自动提交 提交和回滚
    14.3.2.1 Transaction Isolation Levels 事务隔离级别
    14.3.2.1 Transaction Isolation Levels 事务隔离级别
  • 原文地址:https://www.cnblogs.com/maohuidong/p/14216119.html
Copyright © 2011-2022 走看看