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

    }
  • 相关阅读:
    Ubuntu16.04+cuda9.0+matlab+opencv3.3+caffe服务器配置(问题汇总)
    numpy 实践记录
    qwe框架- CNN 实现
    qwe 简易深度框架
    深度拾遗(08)
    python 环境配置
    Robotframework Web自动化实战课程
    常用javascript代码片段集锦
    AJax跨域请求百度音乐接口数据展示页面
    JavaScript 经典实例收集整理
  • 原文地址:https://www.cnblogs.com/maohuidong/p/14216119.html
Copyright © 2011-2022 走看看