干货分享—通过链表实现队列功能
通过链表实现队列功能
Array | 功能 | 返回 |
---|---|---|
push | 底部插入 | 数组长度 |
unshift | 顶部插入 | 数组长度 |
pop | 底部删除 | 删除的元素 |
shift | 顶部删除 | 删除的元素 |
队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头1。比如上面表格中的push+shift或者unshift+pop,都具备模拟队列的功能。
链表是一种非连续、非顺序的存储结构,它是由节点构成,而每一个节点都具备两个部分,其一为节点存储的数据,其二是相邻节点的引用地址。
单向链表实现队列功能
单向链表(单链表)是链表的一种,其特点是链表的链接方向是单向的,对链表的访问要通过顺序读取从头部开始。2
function createNode(){
let address;//self address
let nextNode;//next node address
let data;//self data
function getAddress(){
return address;
}
function setNextNode(_nextNode){
nextNode = _nextNode;
}
function getNextNode(){
return nextNode;
}
function setData(_data){
data = _data;
}
function getData(){
return data;
}
return address = {
getAddress : getAddress,
setNextNode : setNextNode,
getNextNode : getNextNode,
setData : setData,
getData : getData,
}
};
//底部插入 顶部移除
let queue = (function(){
let headNode = null;
let footNode = null;
function push(_node){
if(!headNode){
headNode = footNode = _node;
}else{
footNode.setNextNode(_node);
footNode = _node;
}
}
function shift(){
if(!headNode){
return headNode;
}else{
let node = headNode.getNextNode();
headNode.setNextNode(null);
headNode = node;
}
}
function foreach(){
forEachNode(headNode);
}
return {
push : push,
shift : shift,
foreach : foreach
}
}());
function forEachNode(node){
if(!!node){
console.log('node.data.name : ' + (node.getData() || 'unKnown'));
let nextNode = node.getNextNode();
forEachNode(nextNode);
}
}
测试代码:
双向链表实现队列功能
双向链表也叫双链表,是链表的一种,它的每个数据结点中都有两个指针,分别指向直接后继和直接前驱。3
function createNode(){
let address;//self address
let nextNode;//next node address
let prevNode;//previous node address
let data;//self data
function getAddress(){
return address;
}
function setNextNode(_nextNode){
nextNode = _nextNode;
}
function getNextNode(){
return nextNode;
}
function getPrevNode(){
return prevNode;
}
function setPrevNode(_prevNode){
prevNode = _prevNode;
}
function setData(_data){
data = _data;
}
function getData(){
return data;
}
return address = {
getAddress : getAddress,
setNextNode : setNextNode,
getNextNode : getNextNode,
setPrevNode : setPrevNode,
getPrevNode : getPrevNode,
setData : setData,
getData : getData,
}
};
//底部移除 顶部插入
let queue = (function(){
let headNode = null;
let footNode = null;
function unshift(_node){
if(!headNode){
headNode = footNode = _node;
}else{
headNode.setPrevNode(_node);
_node.setNextNode(headNode);
headNode = _node;
}
}
function pop(){
if(!headNode){
return headNode;
}else{
let node = footNode.getPrevNode();
if(!node){
return headNode = footNode = node;
}
node.setNextNode(null);
footNode = node;
}
}
function foreach(){
forEachNode(headNode);
}
return {
unshift : unshift,
pop : pop,
foreach : foreach
}
}());
function forEachNode(node){
if(!!node){
console.log('node.data.name : ' + (node.getData() || 'unKnown'));
let nextNode = node.getNextNode();
forEachNode(nextNode);
}
}
测试代码: