数据结构——链表有关

63 阅读1分钟
package com.mj;

import com.sun.xml.internal.ws.api.pipe.NextAction;

/**
 * 链表中每一个元素称为结点
 * @author zhouyanjun
 * @create 2020-07-02 16:35
 */
public class LinkedList<E> extends AbstractList<E> {

    private Node<E> first; //节点也应该是一个类。内部类。    first指向的是最前面的那个节点


    private static class Node<E> {
        E element; //每个节点有自己存储的元素
        Node<E> next; //next是指向下一个Node

        public Node(E element, Node<E> next) {  //创建一个节点,把节点存储的数据拿过来;它的下一个节点也拿过来
            this.element = element;    //它存储的是什么
            this.next = next;  //下一个是什么
        }
    }

    @Override
    public void clear() {
        size = 0;
        first = null;
    }






    @Override
    public E get(int index) {
        return node(index).element;
    }

    @Override
    public E set(int index, E element) {
        Node<E> node = node(index);//先把原来的node取出来
        E old = node.element;//把之前的东西取出来
        node.element = element;//覆盖
        return old;//把原来的东西返回出来
    }

    @Override
    public void add(int index, E element) {
        if(index ==0){
            first = new Node<>(element,first);

        }else{
            Node<E> prev = node(index-1);//获取上一个节点
            prev.next = new Node<E>(element, prev.next);//创建一个新的节点
        }
        size++;
    }

    @Override
    public E remove(int index) {
        Node<E> node = first;//node用来保存被删除的元素
        if(index ==0 ){
            first = first.next;//first指向first的next
        }else{
            Node<E> prev = node(index -1);//先获取前面的元素
            node = prev.next;//被删除的就是prev的next
            prev.next = prev.next.next;//prev的next要指向prev的next的next
            //或者可以这么写,prev.next = node.next;
        }
        size--;
        return node.element;//返回被删除的元素
    }

    @Override
    public int indexOf(E element) {
        return 0;
    }

    /**
     * 获取index位置对应的节点对象
     * @param index
     * @return
     */
    private Node<E> node(int index){   //私有方法,专门用来返回节点,给一个索引,就返回对应的节点
        rangeCheck(index);

        Node<E> node = first; //第一个节点赋值给node
        for (int i = 0; i < index; i++) {
            node = node.next;//从first这个节点开始,一路往下next多少次,和index有关
        }
        return node;
    }



}