0    课程地址

https://coding.imooc.com/lesson/207.html#mid=13430

 

1    重点关注

1.0    代码草图解析

 

 

 

 

1.1    链表插值动画模拟

(可以理解为火车尾加车厢,只不过是火车尾被称为head)

  • 链表头部添加元素

 

 

 

 

 

 

  • 链表中间添加元素

 

 

 

 

 

 

 

 

 

 

2    课程内容


3    Coding

3.1    关键代码

  • 内部类Node

(重点看Node(E e,Node nodeNew)),这个方法是把元素存入当前节点,把指针指向传过来的节点

 

 

/**
     * 1  内部类node
     * @author weidoudou
     * @date 2022/10/28 7:59
     * @return null
     **/
    private class Node{
        //Node 只有两个属性,下一个节点和本节点存储的元素
        private Node next;
        private E e;

        /**
         * 通用调用node方法
         * @author weidoudou
         * @date 2022/10/28 8:17
         * @param e 请添加参数描述
         * @param  nodeNew 请添加参数描述
         * @return null
         **/
        public Node(E e,Node next){
            this.e = e;
            this.next = next;
        }

        /**
         * node 无参构造
         * @author weidoudou
         * @date 2022/10/28 8:15
         * @return null
         **/
        public Node(){
            this(null,null);
        }

        /**
         * node 有参构造
         * @author weidoudou
         * @date 2022/10/28 8:16
         * @param e 请添加参数描述
         * @return null
         **/
        public Node(E e){
           this(e,null);
        }


        @Override
        public String toString() {return e.toString();
        }
    }

 

 

 

  • 链表指定索引添加元素
/**
     * 7  链表添加元素(链表通常不在中间添加元素,编写此段代码完全是为了后续便于理解和二叉树相关知识做铺垫)
     * @author weidoudou
     * @date 2022/10/28 8:45
     * @param index 请添加参数描述
     * @param  e 请添加参数描述
     * @return void
     **/
    public void addElement(int index,E e){
        if(index<0||index>size){
            throw new IllegalArgumentException("索引不正确");
        }

        if(index==0){
            addFirst(e);
        }else{
            Node pre = head;
            for(int i = 0;i<index-1;i++){
                pre = pre.next;
            }

            /*Node nodeNew = new Node(e);
            nodeNew.next = pre.next;
            pre.next = nodeNew;*/

            //优雅写法
            pre.next = new Node(e,pre.next);
            size++;
        }
    }

 

3.2    全量代码(链表添加元素)

package com.company;

/***
 * 链表
 * @author weidoudou
 * @date 2022/10/28 7:56
 **/
public class LikedList<E> {

    /**
     * 1  内部类node
     * @author weidoudou
     * @date 2022/10/28 7:59
     * @return null
     **/
    private class Node{
        //Node 只有两个属性,下一个节点和本节点存储的元素
        private Node next;
        private E e;

        /**
         * 通用调用node方法
         * @author weidoudou
         * @date 2022/10/28 8:17
         * @param e 请添加参数描述
         * @param  nodeNew 请添加参数描述
         * @return null
         **/
        public Node(E e,Node next){
            this.e = e;
            this.next = next;
        }

        /**
         * node 无参构造
         * @author weidoudou
         * @date 2022/10/28 8:15
         * @return null
         **/
        public Node(){
            this(null,null);
        }

        /**
         * node 有参构造
         * @author weidoudou
         * @date 2022/10/28 8:16
         * @param e 请添加参数描述
         * @return null
         **/
        public Node(E e){
           this(e,null);
        }


        @Override
        public String toString() {return e.toString();
        }
    }

    //2 LinkedList 属性 链表头元素(火车头),大小
    private int size;
    private Node head;

    /**
     * 3    LikedList 无参
     * @author weidoudou
     * @date 2022/10/28 8:27
     * @return null
     **/
    public LikedList() {
        this.head = null;
        this.size = 0;
    }

    /**
     * 4  getSize
     * @author weidoudou
     * @date 2022/10/28 8:23
     * @return null
     **/
    public int getSize(){
        return size;
    }

    /**
     * 5  isEmpyt
     * @author weidoudou
     * @date 2022/10/28 8:24
     * @return boolean
     **/
    public boolean isEmpty(){
        return size == 0;
    }

    /**
     * 6  链表头部添加元素
     * @author weidoudou
     * @date 2022/10/28 8:37
     * @param e 请添加参数描述
     * @return void
     **/
    public void addFirst(E e){
        /*Node nodeNew = new Node(e);
        nodeNew.next = head;    //火车尾指向 上个尾巴
        this.head = nodeNew;    //火车尾 变成了当前的node*/

        //称之为优雅写法
        this.head = new Node(e,head);
        size++;
    }

    /**
     * 7  链表添加元素(链表通常不在中间添加元素,编写此段代码完全是为了后续便于理解和二叉树相关知识做铺垫)
     * @author weidoudou
     * @date 2022/10/28 8:45
     * @param index 请添加参数描述
     * @param  e 请添加参数描述
     * @return void
     **/
    public void addElement(int index,E e){
        if(index<0||index>size){
            throw new IllegalArgumentException("索引不正确");
        }

        if(index==0){
            addFirst(e);
        }else{
            Node pre = head;
            for(int i = 0;i<index-1;i++){
                pre = pre.next;
            }

            /*Node nodeNew = new Node(e);
            nodeNew.next = pre.next;
            pre.next = nodeNew;*/

            //优雅写法
            pre.next = new Node(e,pre.next);
            size++;
        }
    }


    /**
     * 8  链表尾部添加元素 认真分析下
     * @author weidoudou
     * @date 2022/10/28 18:11
     * @param e 请添加参数描述
     * @return void
     **/
    public void addLast(E e){
        addElement(size,e);
    }


}

 

posted on 2022-10-28 18:41  菜鸟乙  阅读(137)  评论(0编辑  收藏  举报

目录导航