js数据结构——链表(一)

1.创建链表

//定义链表对象 
function LinkedList(){
        //定义节点类
        var Node = function(element){
            this.element = element;    //元素值
            this.next = null;          //next元素,指向下一个节点
        }
        var length = 0;
        var head = null;
}

2.向链表尾部追加元素

LinkedList.prototype.append = function(element){
                //新建一个几点对象,然后创建一个游标
                var node = new Node(element),
                        current;
                if(head == null){       //列表中第一个节点
                    head = node;
                }else{
                    current = head;
                    //循环列表直到找到最后一项
                    while(current.next){
                        current = current.next;
                    }
                    //找到最后一项并将其next赋为node,建立连接
                    current.next = node;
                }
                length++;       //更新链表的长度
            };

(1)先将传入的参数变为节点类型的实例,使其具有next属性。

(2)然后定义一个游标current,游标的作用即使保证原链表不变,而游标通过移动,获取要操作的位置,并可以获取链表中的一段。方便链表的拼接操作。

(3)如果链表为空,直接head = node。

(4)如果不为空,通过游标current找到最后一项,然后current.next = node;

 3.在任意位置插入一个元素

LinkedList.prototype.insert = function(position,element){
                //检查边界值,在链表长度范围内才能执行
                if(position >= 0 && position <= length){
                    var node = new Node(element),
                            current = head,
                            previous,
                            index = 0;
                    if(position === 0){         //如果添加的位置是0
                        node.next = current;
                        head =node;
                    }else{
                        while(index++ < position){ //循环,直到找到要插入位置的前一个节点
                            previous = current;
                            current = current.next;
                        }
                        node.next = current;
                        previous.next = node;
                    }
                    length++;                   //更新链表长度
                    return true;
                }else{
                    return false;
                }
            };

(1)两个参数,position和element

(2)posiiton在0~length-1之间才能执行

(3)如果position是0,node.next = current;然后把head节点赋值为node即可

(4)否则,通过current找到要插入的位置,该位置的前一位是previous,然后node.next = current;previous.next = node;即可

 4.从链表中移除元素

LinkedList.prototype.removeAt = function(position){
                //检查是否越界
                if(position >= 0 && position < length){
                    var 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;
                }
            };

(1)参数:position

(2)如果要移除的是第一项,直接head = current.next;

(3)否则循环找到要移除的位置,而要移除的前一位是previous,然后将previous.next = current.next;即可,就移除了current。

 4.indexOf()方法

//获取元素索引值
            LinkedList.prototype.indexOf = function(element){
                var current = head,
                        index = 0;
                while(current){
                    if(element === current.element){
                        return index;
                    }
                    index++;
                    current = current.next;
                }
                return -1;
            };

(1)参数:element

(2)循环条件:当前current存在

(3)如果element等于当前current值,返回index

(4)如果不等,current = current.next;索引值index++;

(5)如果前面都没返回值,那最后的return语句得到执行,返回-1,表示未找到

5.toString()方法

LinkedList.prototype.toString = function(){
                var current = head,
                        string = '';
                while(current){
                    string += current.element+" ";
                    current = current.next;
                }
                return string;
            };
            //判空
            LinkedList.prototype.isEmpty = function(){
                return length === 0;
            };

 (1)循环条件:current存在

 (2)拼接字符串

 (3)current=current.next

 总结

1.head节点十分重要,任何操作的发起都是从head开始,有时候我们看似已经完成了插入或删除操作,但忘记重新赋head节点的值,会导致下一次操作无法正常进行

2.current和previous都是游标类型的节点,在不影响原链表的情况下,用于找到要操作的位置,并可以获取链表中的一段。一般给current赋初值位head。

3.在插入,移除的时候,要判断位置是否为0;在追加的时候,要判断链表是否位空。

转载于:https://my.oschina.net/wyc1219/blog/829264

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值