双向链表的使用

双向链表的使用

双向链表也称为双链表,是链表的一种,它的每个数据节点都有两个指针,分别指向直接后继和直接前驱。所以,从双向链表中的任意一个节点开始,都可以很方便地访问它的前驱节点和后继节点。

  • 双向链表是这种通过pir知道自己的前面是谁,next知道自己后面是谁
  • 下面这个图片是用一种平面的方式描绘出来
    在这里插入图片描述
    在这里插入图片描述

代码实现

package com.rj.bd.LXY.Test.Node;

import lombok.SneakyThrows;

/**
 * @author LXY
 * @desc
 * @time 2023--04--11--14:55
 */
public class LinkNode<T> {

    //首个
     Node<T> first;
     //最后的
     Node<T> last;

     int size = 0;

     //删除方法
     public  void remove(int index){
         //查询出来需要的Node
         Node<T> temp = getnode(index);

         //取出Node之中的前面的元素和后面的元素
         Node next=temp.next;
         Node per=temp.pri;

         if (per==null){
             //反向思考,如果per==null,代表的是他删除的是第一个元素   就直接让first等于剩下的元素即可
             first=next;
         }else {
             //否则的话删除的不是第一个元素,不是第一个元素的话
             per.next=next;
             temp.pri=null;
         }

         if (next==null){
             //删除的是最后一个元素
             last=per;
         }else {
             next.pri = per;
             temp.next = null;
         }
        size--;
     }





    /**
     * 查询方法
     * @param index
     * @return
     */
     public T get(int index){
         //点睛之笔,如果传递的索引小于一半了,就从first开始查  ,否则就从last开始查

        return getnode(index).data;
     }

     //查询数据,返回需要的Node节点
     public Node<T> getnode(int index){
         if (index < (size >> 1)) {
             Node<T> temp = this.first;
             for (int i = 0; i < index; i++) {
                 //后移,后移到想要的数据,返回
                 temp=temp.next;
             }
             return  temp;
         }
         else{
             Node<T> temp = this.last;
             for (int i = size - 1; i > index; i--){
                 //后移,后移到想要的数据,返回
                 temp=temp.pri;
             }
             return  temp;
         }
     }


    /**
     * 添加功能  first是从前往后进行存储    last是从后往前进行存储
     */
    public void add(T e){
        //临时变量承接
        final Node<T> temp = this.last;
        //新的newnode
        Node<T> newNode = new Node<T>(temp, e, null);
        last=newNode;

        if (temp==null)
            first=newNode;
        else
            temp.next=newNode;
        size++;
    }


    /**
     * Node实体
     * @param <T>
     */
    public  static  class Node <T> {
        private  T data;
        //上坐标
        private  Node<T> pri;
        //下坐标
        private  Node<T>next;
        public Node( Node<T> pri,T data, Node<T> next) {
            this.data = data;
            this.pri = pri;
            this.next = next;
        }
        public Node( ) {
        }
    }



}

  • remove方法是有点不好理解,其原理是将查询出来的数据分为了
  • Node next=temp.next;
    Node per=temp.pri;
    per的next数据是有脏数据的,需要per.next=next;,这样per的数据就不是脏数据了
    next的per是有脏数据的,将没有脏数据的per直接装入进入就没脏数据了,这样两个都没脏数据了,实现了删除
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值