JavaScript数据结构与算法学习笔记之双向链表(2)

本文详细解析了双向链表中在任意位置插入新元素的三种情况:列表开头、结尾和中间位置。通过代码和图示说明了每种情况下新元素如何与原有元素建立前后链接。

双向链表在任意位置插入一个新元素

    //在任意位置插入一个新元素
    this.insert = function(position,element){
        //检查越界值
        if(position >= 0 && position <= length){
            var node = new Node(element),
                current = head,
                previous,
                index = 0;
            if(position === 0) {//在第一个位置添加
                if(!head){//新增的 {1}
                    head = node;
                    tail = node;
                } else {
                    node.next = current;
                    current.prev = node;//新增的 {2}
                    head = node;
                }

            } else if(position === length) {//最后一项 //新增的
                current = tail;
                current.next = node;
                node.prev = current;
                tail = node;
            } else {
                while(index++ < position){//{4}
                    previous = current;
                    current = current.next;
                }
                node.next = current;//{5}
                previous.next = node;
                current.prev = node;
                node.prev = previous;
            }
            length++;//更新列表的长度
            return true;
        } else  {
            return false;
        }
    }

我们来分析第一种场景:在列表的第一个位置(列表的起点)插入一个新元素。

  1. 如果列表为空(行{1}),只需要把head和tail都指向这个新节点。
  2. 如果不为空,current变量将是对列表中第一个元素的引用。
  3. 就像我们在链表中所做的,把node.next设为current,而head将指向node(它将成为列表中的第一个元素)。
  4. 不同之处在于,我们还需要为指向上一个元素的指针设一个值。
  5. current.prev指针将由指向null变为指向新元素(node——行{2})。
  6. node.prev指针已经是null,因此不需要再更新任何东西。

 下图演示了这个过程:

 

现在来分析一下,假如我们要在列表最后添加一个新元素。

  1. 这是一个特殊情况,因为我们还控制着指向最后一个元素的指针(tail)。
  2. current变量将引用最后一个元素(行{3})。
  3. 然后开始建立第一个链接:node.prev将引用current。
  4. current.next指针(指向null)将指向node(由于构造函数,node.next已经指向了null)。
  5. 然后只剩一件事了,就是更新tail,它将由指向current变为指向node。

下图展示了这些行为: 

然后还有第三种场景:在列表中间插入一个新元素。

  1. 就像我们在之前的方法中所做的,迭代列表,直到到达要找的位置(行{4})。
  2. 我们将在current和previous元素之间插入新元素。
  3. 首先,node.next将指向current(行{5}),而previous.next将指向node,这样就不会丢失节点之间的链接。
  4. 然后需要处理所有的链接:current.prev将指向node,而node.prev将指向previous。

下图展示了这一过程:

 

基于数据驱动的 Koopman 算子的递归神经网络模型线性化,用于纳米定位系统的预测控制研究(Matlab代码实现)内容概要:本文围绕“基于数据驱动的Koopman算子的递归神经网络模型线性化”展开,旨在研究纳米定位系统的预测控制问题,并提供完整的Matlab代码实现。文章结合数据驱动方法Koopman算子理论,利用递归神经网络(RNN)对非线性系统进行建模线性化处理,从而提升纳米级定位系统的精度动态响应性能。该方法通过提取系统隐含动态特征,构建近似线性模型,便于后续模型预测控制(MPC)的设计优化,适用于高精度自动化控制场景。文中还展示了相关实验验证仿真结果,证明了该方法的有效性和先进性。; 适合人群:具备一定控制理论基础和Matlab编程能力,从事精密控制、智能制造、自动化或相关领域研究的研究生、科研人员及工程技术人员。; 使用场景及目标:①应用于纳米级精密定位系统(如原子力显微镜、半导体制造设备)中的高性能控制设计;②为非线性系统建模线性化提供一种结合深度学习现代控制理论的新思路;③帮助读者掌握Koopman算子、RNN建模模型预测控制的综合应用。; 阅读建议:建议读者结合提供的Matlab代码逐段理解算法实现流程,重点关注数据预处理、RNN结构设计、Koopman观测矩阵构建及MPC控制器集成等关键环节,并可通过更换实际系统数据进行迁移验证,深化对方法泛化能力的理解。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值