JavaScript之链表操作

单链表

//Node类和LList类

function Node(element){
    this.element=element;
    this.next=null;
}

function LList(){
    this.head=new Node("head");
    this.find=find;
    this.insert=insert;
    this.display=display;
    this.findPrevious=findPrevious;
    this.remove=remove;
}


//找到前一个
//即找到当前的下一个元素的节点是否等于item,若相等则返回当前元素,此时的当前元素相对于item即为找到其前一个元素。
function findPrevious(item){
    var currNode=this.head;
    while(!(currNode.next==null)&&(currNode.next.element!=item)){
        currNode=currNode.next;
    }
    return currNode;
}
//显示
function display(){
    var currNode=this.head;
    while(!(currNode.next==null)){
        print(currNode.next.element);
        currNode=currNode.next;
}

//查找
function find(item){
    var currNode=this.head;
    while(currNode.element!=item){
        currNode=currNode.next;
    }
    return currNode;
}

//插入
function insert(newElement,item){
    var newNode=new Node(newElement);
    var current=this.find(item);
    newNode.next=current.next;
    current.next=newNode;
}


//移除
function remove(item){
    var preNode=this.findPrevious(item);
    if(!(preNode.next==null)){
        preNode.next=preNode.next.next;
    }
}   

双向链表

为节点添加一个前驱和一个后继。

//Node类构造函数
function Node(element){
    this.element=element;
    this.next=null;
    this.previous=null;
}

//display()
function display(){
    var currNode=this.head;
    while(!(currNode.next==null)){
        print(currNode.next.element);
        currNode=currNode.next;
    }
}

//find
function find(item){
    var currNode=this.head;
    while(currNode.next!=item){
        currNode=currNode.next;
    }
    return currNode;
}

//insert插入(在当前节点的下一个插入新节点)
//插入节点时候,先将新节点的next连指向当前的节点的下一个,然后再将新节点的previous连接到当前节点,让当前节点的next指向新节点。
function insert(newElement,item){
    var newNode=new Node(newElement);
    var current=this.find(item);
    newNode.next=current.next;
    newNode.previous=current;
    current.next=newNode;
}

//remove移除
//移除的时候,将当前节点的previous的next等于当前节点的next.将当前节点next的previous等于当前节点的previous.然后删除currNode节点。
function remove(item){
    var currNode=this.find(item);
    if(!(currNode.next==null)){
        currNode.previous.next=currNode.next;
        currNode.next.previous=currNode.previous;
        currNode.next=null;
        currNode.previous=null;
    }
}

//找到双向链表中的最后一个节点findLast
function findLast(){
    var currNode=this.head;
    while(!(currNode.next==null)){
        currNode=currNode.next;
    }
    return currNode;
}

//反序显示双向链表中的元素
function disReverse(){
    var currNode=this.head;
    currNode=this.findLast();
    while(!(currNode.next==null)){
        print(currNode.element);
        currNode=currNode.previous;
    }
}

循环链表

在创建循环链表中,其头节点的next属性指向它本身,即:

head.next=head;

因此,以原来的方式进行会在循环链表中陷入死循环,while循环条件需要修改,需要检查头节点,当循环到头节点时退出循环。

//node类和LList类
//Node类和LList类

function Node(element){
    this.element=element;
    this.next=null;
}

function LList(){
    this.head=new Node("head");
    this.head.next=this.head;
    this.find=find;
    this.insert=insert;
    this.display=display;
    this.findPrevious=findPrevious;
    this.remove=remove;
}

//显示
function display(){
    var currNode=this.head;
    while(!(currNode.next==null)&&!(currNode.next.element=="head")){
        print(currNode.next.element);
        currNode=currNode.next;
}

//查找
function find(item){
    var currNode=this.head;
    while(currNode.element!=item && currNode.next.element!="head"){
        currNode=currNode.next;
    }
    return currNode;
}

//插入
function insert(newElement,item){
    var newNode=new Node(newElement);
    var current=this.find(item);
    newNode.next=current.next;
    current.next=newNode;
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值