js线性表的链式表示的例子.经典数据结构}

本文介绍了一种用JS实现线性表的链式表示法,供大家参考,如下:

从前面的部分来看,顺序存储结构的缺点是,在插入或删除操作时,需要移动大量的元素,因此我们需要在这里引入链式结构。因为它不需要逻辑相邻的元素与物理位置相邻,所以它在顺序存储结构中没有弱点,但是顺序列表不能随机访问是没有优势的。

下面是链表的列表。

线性表链存储结构使用一组任意存储单元来存储线性表的数据元素,因此,除了存储自己的信息外,每个数据元素都需要存储指向其继承者的信息,这两部分信息构成了该元素的内存映像,称为节点。

该节点由两个域组成:数据字段和指针字段。

数据字段是将数据元素存储在元素中的信息。

指针字段是存储在元素中的后续存储位置的信息。

n个节点链接成为链表,即链表的链式存储结构,因为这个列表中的每个节点只包含一个指针域,所有这些指针又称为线性链表或单链表。

举一个例子



上图中所示的线性表是

赵,钱,孙,里县,周,吴,郑,王

应该更好地理解。

下面我们使用js代码实现列表的插入和删除以及查找操作。







var node =功能(数据){ / /创建节点对象
this.next = null;
this.data = null;
此函数=(){
this.data =新的数据;
};
这个init();
}
/ /定义列表
var list =函数(){()
this.head = null;
this.size = 0;
此函数=(){
this.head = null;
this.size = 0;
}
这个init();
这个插入=功能(数据){ / /初始批量插入
this.size = 1;
无功节点=新的节点(数据);
如果(this.head = = null){
this.head =节点;
返回;
}
无功tempnode = this.head;
而(tempnode.next!= null)
tempnode = tempnode.next; / /查找表尾
tempnode.next =节点; / /将新元素插入到表尾
};
this.getdata =功能(POS){ / /搜索操作
如果(POS this.size POS | | < > = 0)
返回null;
别的{
tempnode = this.head;
对于(i = 0;i <;词性;i + +)
tempnode = tempnode.next; / /找到位置
返回tempnode.data;
}
};
这个函数。
如果(POS this.size POS | | < > = 0)
空回;
this.size = 1;
tempnode = this.head;
如果(POS = 0){
this.head = this.head.next;
返回this.head;
}
对于(i = 0;i < POS - 1;i + +){
tempnode = tempnode.next;
}
tempnode.next = tempnode.next.next;
返回tempnode.next;
};
本。在=功能(数据,POS){ / /插入节点从一个位置之前
如果(POS > =本。大小| | POS<0)
空回;
这个。大小= 1;
tempnode = this.head;
无功节点=新的节点(数据); / /创建一个数据节点
如果(POS = 0){
NewNode tempnode下=;
返回newnode.next;
}
为(i = 0;i < pos-1;i++){
tempnode = tempnode.next; / /找到插入的位置
}
NewNode。下= tempnode.next; / /插入操作
TempNode。下一组节点;
返回newnode.next;
};
这一点。
document.write(元素在列表:);
tempnode = this.head;
而(tempnode!= NULL){
document.write(tempnode.data + );
tempnode = tempnode.next;
}
document.write();
};
};
运行测试:
var列表=新列表();
var array =新的数组(1,2,3,4,5,6);
为(i = 0;i < array.length;i++){
列表。插入(数组{ });
}
列表。打印();
document.write(发现作为4要素);
VaR数据= list.getdata(4);
document.write(数据+ );
document.write(删除操作:);
列表。删除(5);
列表。打印();
document.write(插入操作:);
list.insertbefore(5/7);
列表。打印();
document.write(大小链表:+列表大小。);









跑去获得结果



首先,分析插入和删除的代码。


本。在=功能(数据,POS){ / /插入节点从一个位置之前
如果(POS > =本。大小| | POS<0)
返回null;
这个。大小= 1;
tempnode = this.head;
无功节点=新的节点(数据); / /创建一个数据节点
如果(POS = 0){
NewNode tempnode下=;
返回newnode.next;
}
为(i = 0;i < pos-1;i++){
tempnode = tempnode.next; / /找到插入的位置
}
NewNode。下= tempnode.next; / /插入操作
TempNode。下一组节点;
返回newnode.next;
};
这个函数。
如果(POS this.size POS | | < > = 0)
返回null;
this.size = 1;
tempnode = this.head;
如果(POS = 0){
this.head = this.head.next;
返回this.head;
}
对于(i = 0;i < POS - 1;i + +){
tempnode = tempnode.next;
}
tempnode.next = tempnode.next.next;
返回tempnode.next;
};




你可以看到,插入和删除的世界的复杂性为O(n)。I-1元素被插入或删除节点之前,我发现。

看看初始化方法插入,


这个插入=功能(数据){ / /初始批量插入
这个。大小= 1;
无功节点=新的节点(数据);
如果(this.head = = null){
this.head =节点;
返回;
}
无功tempnode = this.head;
而(tempnode.next!= null)
tempnode = tempnode.next; / /查找表尾
TempNode。下=节点; / /将新元素插入到表尾
};




初始插入法的时间复杂度也为o(n)。

这是另一种形式的链式存储结构的介绍,这是一个循环的列表。它的特点是在桌子上点上节点的头节点的指针字段,和整个产业链形成一个环。有时,它可以通过设置在一个而不是设置头指针表尾指针简化操作。例如,当两个线性表设置为一个表,只有一桌子的一端连接到另一个表的头。这次操作的复杂度为O(1)。

如下图所示



上面列出的列表只能通过一个节点找到下一个节点,也就是说,在单链表中,查找下一个节点的时间复杂度是O(1),而查找最后一个节点的时间复杂度为O(n),为了克服单链表的单向缺点,可以使用双向链表。

更多有关Javascript相关内容的读者可以看到特别的站点:Javascript数据结构和算法

希望本文能对javascript程序设计有所帮助。