手写LikendList和LikendList原理

自己手写LinkedList时,发现处理节点有些时候思维有点重复,后面调试的时候才发现有些代码重复了。
1.链表结构

在这里插入图片描述
likendList底层就是有一个Node对象,node对象中有三个要素:见代码
在这里插入图片描述
添加有两种方式,无非就是改变节点前后对应的节点,删除也是一样,核心思想在于如何操作节点。



import lombok.Data;
@Data
public class ExtLinkedList<E> {

    private Node first;//第一个节点
    private Node last;//最后一个节点
    private volatile int size=0;
    public void add(E e){
        Node node = new Node();
        node.object=e;
        if(first==null){
            //如果第一个节点为空
            first=node;
        }else{
            //新节点的前一个是last
            node.prev=last;
            //最后一个节点的下一个是新节点
            last.next=node;
        }
        //新的节点变成最后一个
        last=node;
        //长度加一
        size++;
    }
    public void add(Integer index,E e){
        checkElementIndex(index);
        //先找到index上的节点
        Node node=getNode(index);
        //新建节点
        Node newNode=new Node();
        //得到原来节点的上一个节点
        Node prev=node.prev;
        newNode.object=e;
        //如果老节点的上一个节点为空
        if(prev==null){
            newNode=first;
        }else{
            //老节点的下一个节点是新节点
            prev.next=newNode;
            //新节点的下一个节点是老节点
            newNode.next=node;
            //长度加1
            size++;
        }

    }

    public Node getNode(Integer index){
        checkElementIndex(index);

        Node node=null;
        if(first!=null){
            node=first;
        }
        for (int i=0;i<index;i++) {
            node=node.next;
        }
        return node;
    }

    public E get(Integer index){
        checkElementIndex(index);
        ExtLinkedList<E>.Node node=getNode(index);
        return (E)node.object;
    }

    public void remove(Integer index){
        checkElementIndex(index);
        //找到这个元素
        Node node =getNode(index);
        if(node!=null){
        //得到前一个Node
        Node prev=node.prev;
        //得到下一个节点
        Node next=node.next;
        if(prev!=null) {
            prev.next = next;
        }
        if(next!=null) {
            next.prev = prev;
        }
        }
        size--;
    }

    class Node{
          Node prev;//前一个节点
          Object object;//业务数据
          Node  next;//下一个节点
    }
    private boolean isElementIndex(int index) {
        return index >= 0 && index < size;
    }

    private void checkElementIndex(int index) {
        if (!isElementIndex(index))
            throw new IndexOutOfBoundsException("下标越界");
    }
    public static void main(String[] args) {
        ExtLinkedList<String> extLinkedList=new ExtLinkedList<>();
        extLinkedList.add("111");
        extLinkedList.add("222");
        for (int i = 0; i < extLinkedList.size; i++) {
            System.out.println(extLinkedList.get(i));
        }
        extLinkedList.remove(0);
        for (int i = 0; i < extLinkedList.size; i++) {
            System.out.println(extLinkedList.get(i));
        }
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值