不二如是 发表于 2018-4-8 17:53:41

0010 ¥ 自建链表方法之#removeAt

本帖最后由 不二如是 于 2018-4-8 17:53 编辑

http://xxx.fishc.com/forum/201803/20/101934b3igkgm9hgbgz0ck.gif



在上一讲我们完成了append方法,这次来实现“删除”。

在开始前,先让我们来看看链表中是如何删除一个元素的,有两个场景:
1、移除链表中的第一个元素。
2、移除非第一个以外的任意一个元素。

移除元素首先要得到元素的位置,那么就需要验证这个位置是否为链表中的有效位置。

所谓的有效位置,就是从位置0开始到最后一项(size-1)都是有效值,否则返回null(没有从链表中移除元素)。
//检查是否为有效位置(越界)
            if (position > -1 && position < length){
                } else {
                }


先来模拟第一种场景,要从链表中移除第一个元素(position == 0):


要移除第一个元素,要做的就是让head指向链表中原来的第二个元素。

我们此时用current变量创建一个对链表中第一个元素的引用,然后把head指向current.next,就会移除链表中的第一个元素。

现在,进入情景二,移除非第一个元素。

为此,需要依靠一个变量来迭代链表,直到目标位置。

此时我们使用一个用于内部控制和递增的index变量。

current变量总是为对所有循环链表的当前元素的引用,还需要一个对当前元素的前一个元素的引用的变量,命名为previous。

因此要从链表中移除当前元素,要做的就是将previous.next和current.next连接起来。

这样当前元素就会被丢弃在计算机内存中,等着被垃圾回收机制清除。

还是画一张图,首先考虑移除最后一个元素:


对于最后一个元素,current变量将是对链表中最后一个元素的引用(要移除的元素)。

current.next将是null(最后一个元素),previous.next指向了current。

那么要移除current,要做的就是把previous.next的值改变为current.next。

对于链表中的中间项,也可以应用上述逻辑:


current变量是对移除元素的引用,previous变量是对要移除元素的前一个元素的引用。

那么要移除current元素,需要做的就是将previous.next与current.next连接起来。

上述过程的代码实现:
从链表中特定位置移除一项
      this.removeAt = function (position) {
            //检查是否为有效位置(越界)
            if (position > -1 && position < length) {
//                初始化变量
                let current = head,
                  previous,
                  index = 0;
//                移除第一个元素
                if (position === 0) {
                  head = current.next;
                } else {
//                移除非第一个
                  while (index++ < position) {
                        previous = current;
                        current = current.next;
                  }
//                将previous与current的下一项连接起来,跳过current,从而移除它
                  previous.next = current.next;
                }
//                更新链表长度
                length--;
                return current.element;
            } else {
                return null;
            }
      };





如果有收获,别忘了评分{:10_281:} :

http://xxx.fishc.com/forum/201709/19/094516hku92k2g4kefz8ms.gif

这位鱼油,如果喜欢本系列学习笔记,请订阅 专辑☞(传送门)(不喜欢更要订阅{:10_297:} )

http://xxx.fishc.com/forum/201803/21/151715umqz1qoywp11wjbq.gif

一切都成往事丶 发表于 2018-4-9 08:25:07

{:10_269:}想学。
页: [1]
查看完整版本: 0010 ¥ 自建链表方法之#removeAt