双链表

双链表的实现

1. 接口

package com.DS.DoubleLinked;

/**
 * @Name:链表接口
 * @Author:ZYJ
 * @Date:2019-07-23-15:21
 * @Description:
 */
public interface ILinked {
    // 头插法
    void addFirst(Object data);
    // 尾插法
    void addLast(Object data);
    // 任意位置插入,第一个数据节点为0号下标
    void addIndex(int index, Object data);
    // 查找是否包含关键字key是否在单链表当中
    boolean contains(Object data);
    // 删除第一次出现关键字为key的节点
    Object remove(int index);
    //删除所有值为key的节点
    void removeAllKey(Object key);
    //获取指定索引的节点
    Object get(int index);
    //将指定索引的数据设置为data
    Object set(int index, Object newData);
    //得到单链表的长度
    int getLength();
    void display();
}

2. 实现类

package com.DS.DoubleLinked;

import java.util.Vector;

/**
 * @Name: 双链表实现
 * @Author:ZYJ
 * @Date:2019-07-24-10:25
 * @Description:
 */
public class DoubleLikedImpl implements ILinked {
    private Node head;//头节点
    private Node last;//尾结点
    private int size;//长度

    /**
     * 创建节点类
     */
    private class Node {
        private Node prev;//前驱
        private Object data;//值
        private Node next;//后继
        public Node(Node prev, Object data, Node next) {
            this.prev = prev;
            this.data = data;
            this.next = next;
        }
        public Node(Object data) {
            this.data = data;
        }
    }

    /**
     * 头插
     *
     * @param data
     */
    @Override
    public void addFirst(Object data) {
        Node prev = head;
        Node newNode = new Node(null, data, prev);
        head = newNode;
        if (prev == null) {
            last = newNode;
        } else {
            prev.prev = newNode;
        }
        size++;
    }

    /**
     * 尾插
     *
     * @param data
     */
    @Override
    public void addLast(Object data) {
        Node pred = this.last;//尾结点
        Node newNode = new Node(pred, data, null);
        this.last = newNode;//将新节点设置为尾结点
        if (pred == null) {//若尾结点为null
            this.head = newNode;//链表为空,新节点为头节点
        } else {
            pred.next = newNode;
        }
        this.size++;
    }

    private boolean isLinkIndex(int index) {
        if (index < 0 || index > size) {
            return false;
        }
        return true;
    }

    @Override
    public void addIndex(int index, Object data) {
        if(isLinkIndex(index)){
            Node temp =node(index);
            Node prev =temp.prev;
            Node newData =new Node(prev,data,temp);
            temp.prev=newData;
            if(prev==null){
                this.head=newData;
            }else {
                prev.next=newData;
            }
            size++;
        }
    }

    @Override
    public boolean contains(Object data) {
        if (data == null) {
            for (int i = 0; i <this.size; i++) {
                if (node(i).data == null) {
                    return true;
                }
            }
        } else {
            for (int i = 0; i <this.size; i++) {
                if (node(i).data.equals(data)) {
                    return true;
                }
            }
        }
        return false;
    }

    @Override
    public Object remove(int index) {
        if (isLinkIndex(index)) {
            Node temp = node(index);
            Object oldData = temp.data;
            unLink(temp);
            return oldData;
        }
        return null;
    }

    private Object unLink(Node x) {
        Object elementData = x.data;
        Node prev = x.prev;
        Node next = x.next;
        if(prev==null){
            this.head=next;
        }else {
            prev.next=next;
            x.prev=null;
        }
        if(next==null){
            this.last=prev;
        }else{
            next.prev=prev;
            x.next=null;
        }
        x.data=null;
        this.size--;
        return elementData;
    }

    /**
     * 删除所值为Key的节点;
     * @param key
     */
    @Override
    public void removeAllKey(Object key) {
        Node pred =this.head;
      while (pred!=null){
          Node prev =pred.prev;
          Node next =pred.next;
          if(pred.data==key){
              if(prev==null){
                  this.head=next;
              }else{
                  prev.next=next;
                  pred.prev=null;
              }
              if(next==null){
                  this.last=prev;
              }else {
                  next.prev=prev;
                  pred.next=null;
              }
              pred.data=null;
              size--;
              pred=next;
          }else {
              pred=pred.next;
          }

      }
    }

    @Override
    public Object get(int index) {
        if(!isLinkIndex(index)){
            return null;
        }
        return node(index).data;
    }

    @Override
    public Object set(int index, Object newData) {
        if(!isLinkIndex(index)){
            return null;
        }
        Node node = node(index);
        Object oldData = node.data;
        node.data=newData;
        return oldData;
    }

    @Override
    public int getLength() {
        return size;
    }

    @Override
    public void display() {
        for (int i = 0; i < this.size; i++) {
            System.out.print(node(i).data);
        }
        System.out.println();

    }

    /**
     * 获取当前节点
     *
     * @param index
     * @return
     */
    private Node node(int index) {
        isLinkIndex(index);
        if (index < (size >> 1)) {
            Node temp = this.head;
            for (int i = 0; i < index; i++) {
                temp = temp.next;
            }
            return temp;
        }
        Node temp = this.last;
        for (int i = size - 1; i > index; i--) {
            temp = temp.prev;
        }
        return temp;
    }
}

3. 测试类

package com.DS.DoubleLinked;

/**
 * @Name:测试类
 * @Author:ZYJ
 * @Date:2019-07-24-10:27
 * @Description:
 */
public class TestDemo {
    public static void main(String[] args) {
        ILinked iLinked = new DoubleLikedImpl();
        iLinked.addFirst(1);
        iLinked.addFirst(2);
        iLinked.addFirst(3);
        iLinked.addIndex(1, 3);
        iLinked.display();//3321
        iLinked.addLast(3);
        iLinked.display();//33213
        System.out.println(iLinked.contains(3));//true
        System.out.println(iLinked.getLength());//5
        System.out.println(iLinked.contains(7));//false
        System.out.println(iLinked.contains(3));//true
        System.out.println(iLinked.contains(0));//false
        iLinked.display();//33213
        System.out.println(iLinked.remove(1));//3
        iLinked.display();//3213
        System.out.println(iLinked.set(2,8));//3
        //System.out.println(iLinked.get(0));//8
        iLinked.display();//3283
        System.out.println(iLinked.set(0,7));
        iLinked.display();
        iLinked.addFirst(2);
        iLinked.addLast(2);
        iLinked.display();//272832
        iLinked.removeAllKey(2);
        iLinked.display();//783
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
基于LSTM的财务因子预测选股模型LSTM (Long Short-Term Memory) 是一种特殊的循环神经网络(RNN)架构,用于处理具有长期依赖关系的序列数据。传统的RNN在处理长序列时往往会遇到梯度消失或梯度爆炸的问题,导致无法有效地捕捉长期依赖。LSTM通过引入门控机制(Gating Mechanism)和记忆单元(Memory Cell)来克服这些问题。 以下是LSTM的基本结构和主要组件: 记忆单元(Memory Cell):记忆单元是LSTM的核心,用于存储长期信息。它像一个传送带一样,在整个链上运行,只有一些小的线性交互。信息很容易地在其上保持不变。 输入门(Input Gate):输入门决定了哪些新的信息会被加入到记忆单元中。它由当前时刻的输入和上一时刻的隐藏状态共同决定。 遗忘门(Forget Gate):遗忘门决定了哪些信息会从记忆单元中被丢弃或遗忘。它也由当前时刻的输入和上一时刻的隐藏状态共同决定。 输出门(Output Gate):输出门决定了哪些信息会从记忆单元中输出到当前时刻的隐藏状态中。同样地,它也由当前时刻的输入和上一时刻的隐藏状态共同决定。 LSTM的计算过程可以大致描述为: 通过遗忘门决定从记忆单元中丢弃哪些信息。 通过输入门决定哪些新的信息会被加入到记忆单元中。 更新记忆单元的状态。 通过输出门决定哪些信息会从记忆单元中输出到当前时刻的隐藏状态中。 由于LSTM能够有效地处理长期依赖关系,它在许多序列建模任务中都取得了很好的效果,如语音识别、文本生成、机器翻译、时序预测等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值