最新文章专题视频专题问答1问答10问答100问答1000问答2000关键字专题1关键字专题50关键字专题500关键字专题1500TAG最新视频文章推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37视频文章20视频文章30视频文章40视频文章50视频文章60 视频文章70视频文章80视频文章90视频文章100视频文章120视频文章140 视频2关键字专题关键字专题tag2tag3文章专题文章专题2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章专题3
当前位置: 首页 - 科技 - 知识百科 - 正文

JavaScript数据结构之双向链表和双向循环链表的实现

来源:动视网 责编:小采 时间:2020-11-27 22:24:40
文档

JavaScript数据结构之双向链表和双向循环链表的实现

JavaScript数据结构之双向链表和双向循环链表的实现:双向链表和普通链表的区别在于,在链表中,一个节点只有链向下一个节点的链接,而在双向链表中,链接是双向的:一个链向下一个元素,另一个链向前一个元素。 双向链表提供了两种迭代列表的方法:从头到尾,或者反过来。我们也可以访问一个特定节点的下一个
推荐度:
导读JavaScript数据结构之双向链表和双向循环链表的实现:双向链表和普通链表的区别在于,在链表中,一个节点只有链向下一个节点的链接,而在双向链表中,链接是双向的:一个链向下一个元素,另一个链向前一个元素。 双向链表提供了两种迭代列表的方法:从头到尾,或者反过来。我们也可以访问一个特定节点的下一个


双向链表和普通链表的区别在于,在链表中,一个节点只有链向下一个节点的链接,而在双向链表中,链接是双向的:一个链向下一个元素,另一个链向前一个元素。

双向链表提供了两种迭代列表的方法:从头到尾,或者反过来。我们也可以访问一个特定节点的下一个或前一个元素。在单向链表中,如果迭代列表时错过了要找的元素,就需要回到列表起点,重新开始迭代。这是双向链表的一个优点。

双向链表:单向链表只能向着一个方向遍历链表节点,而在节点指针域中增加了前向指针的双向链表,则可以向着两个方向遍历节点。这使得双向链表也可以在任何一个节点遍历整个链表。

function DoublyLinkedList() { 
 var Node = function(element) { 
 this.element = element; 
 this.next = null; 
 this.prev = null; 
 }; 
 
 var length = 0, 
 head = null, 
 tail = null; 
 
 this.append = function(element){ 
 var node = Node(element), 
 current, 
 previous; 
 
 if(!head){ 
 head = node; 
 tail = node; 
 }else{ 
 current = head; 
 while(current){ 
 previous = current; 
 current = current.next; 
 } 
 
 node.next = current; 
 current.prev = node; 
 previous.next = node; 
 node.prev = previous; 
 } 
 
 length++; 
 return true; 
 } 
 
 this.insert = function(position,element){ 
 if(position > -1 && position < length){ 
 var node = new Node(element), 
 current = head, 
 previous, 
 index = 0; 
 
 if(position === 0){ 
 
 if(!head){ 
 head = node; 
 tail = node; 
 }else{ 
 node.next = current; 
 current.prev = node; 
 head = node; 
 } 
 
 }else if (position === length -1){ 
 current = tail; 
 current.next = node; 
 node.prev = current; 
 }else { 
 while(index++ < position){ 
 previous = current; 
 current = current.next; 
 } 
 node.next = current; 
 previous.next = node; 
 current.prev = node; 
 node.prev = previous; 
 } 
 
 length++; 
 return true; 
 }else{ 
 return false; 
 } 
 }; 
 
 this.removeAt = function(position){ 
 if(position > -1 && position < length){ 
 var current = head, 
 index = 0, 
 previous; 
 
 if (position === 0) { 
 head = current.next; 
 
 if(length === 1){ 
 tail = null; 
 }else{ 
 head.prev = null; 
 } 
 }else if(position === length - 1){ 
 current = tail; 
 tail = current.prev; 
 tail.next = null; 
 } else{ 
 while(index++ < position){ 
 previous = current; 
 current = current.next; 
 } 
 
 previous.next = current.next; 
 current.next.prev = previous; 
 }; 
 length-- ; 
 
 return current.element; 
 }else{ 
 return false; 
 } 
 }; 
 
 this.remove = function(element){ 
 var current = head, 
 previous; 
 
 if(current.element === element){ 
 head = current.next; 
 } 
 previous = current; 
 current = current.next; 
 
 while(current){ 
 if (current.element = element) { 
 previous.next = current.next; 
 current.next.prev = previous; 
 }else{ 
 previous = current; 
 current = current.next; 
 } 
 } 
 return false; 
 }; 
 
 this.remove = function(){ 
 if (length === 0) { 
 return false; 
 }; 
 
 var current = head, 
 previous; 
 
 if(length === 1){ 
 head = null; 
 tail = null; 
 length--; 
 return current.element; 
 } 
 
 while(current){ 
 previous = current; 
 current = current.next; 
 } 
 
 previous.next = null; 
 length--; 
 return current.element; 
 }; 
 
 this.indexOf = function(element){ 
 var current = head, 
 index = 0; 
 
 while(current && index++ < length){ 
 if (current.element === element) { 
 return index; 
 }; 
 current = current.next; 
 } 
 
 return false; 
 }; 
 
 this.isEmpty = function(){ 
 return length === 0; 
 }; 
 
 this.size = function(){ 
 return length; 
 }; 
 
 this.toString = function(){ 
 var current = head, 
 string = ''; 
 
 while(current){ 
 string += current.element; 
 current = current.next; 
 } 
 return string; 
 }; 
 
 this.getHead = function(){ 
 return head; 
 }; 
 
 this.getTail = function(){ 
 return tail; 
 }; 
} 

双向循环链表:将双向链表的头尾指针相连,就构成了双向循环链表。这种链表从任意一个节点都可以同时向两个方向进行节点遍历,查询节点的速度也是最快的。

/*双向循环链表*/ 
function DoublyCircularLinkedList(){ 
 var Node = function(element){ 
 this.element = element; 
 this.next = null; 
 this.prev = null; 
 }; 
 
 var length = 0, 
 head = null, 
 tail = null; 
 
 this.append = function(element){ 
 var node = new Node(element), 
 current, 
 previous; 
 
 if (!head) { 
 head = node; 
 tail = node; 
 head.prev = tail; 
 tail.next = head; 
 }else{ 
 current = head; 
 
 while(current.next !== head){ 
 previous = current; 
 current = current.next; 
 } 
 
 current.next = node; 
 node.next = head; 
 node.prev = current; 
 }; 
 
 length++; 
 return true; 
 }; 
 
 this.insert = function(position, element){ 
 if(position >= 0 && position <= length){ 
 var node = new Node(element), 
 index = 0, 
 current = head, 
 previous; 
 
 if(position === 0){ 
 
 if(!head){ 
 
 node.next = node; 
 node.tail = node; 
 head = node; 
 tail = node; 
 
 }else{ 
 
 current.prev = node; 
 node.next = current; 
 head = node; 
 node.prev = tail; 
 
 } 
 
 }else if(position === length){ 
 current = tail; 
 
 current.next = node; 
 node.prev = current; 
 tail = node; 
 node.next = head; 
 }else{ 
 
 while(index++ < position){ 
 previous = current; 
 current = current.next; 
 } 
 
 current.prev = node; 
 node.next = current; 
 previous.next = node; 
 node.prev = previous; 
 
 } 
 
 length++; 
 return true; 
 }else{ 
 return false; 
 } 
 }; 
 
 this.removeAt = function(position){ 
 if(position > -1 && position < length){ 
 
 var current = head, 
 index = 0, 
 previous; 
 
 if(position === 0){ 
 
 current.next.previous = tail; 
 head = current.next; 
 
 }else if(position === length - 1){ 
 
 current = tail; 
 
 current.prev.next = head; 
 head.prev = current.prev; 
 tail = current.prev; 
 }else{ 
 
 while(index++ < position){ 
 previous = current; 
 current = current.next; 
 } 
 
 previous.next = current.next; 
 current.next.prev = previous; 
 
 } 
 
 length--; 
 return true; 
 }else{ 
 return false; 
 } 
 }; 
 
 this.remove = function(element){ 
 var current = head, 
 previous, 
 indexCheck = 0; 
 
 while(current && indexCheck < length){ 
 if(current.element === element){ 
 if(indexCheck === 0){ 
 current.next.prev = tail; 
 head = current.next; 
 }else{ 
 current.next.prev = previous; 
 previous.next = current.next; 
 } 
 length--; 
 return true; 
 } 
 
 previous = current; 
 current = current.next; 
 indexCheck++; 
 } 
 
 return false; 
 }; 
 
 this.remove = function(){ 
 if(length === 0){ 
 return false; 
 } 
 
 var current = head, 
 previous, 
 indexCheck = 0; 
 
 if(length === 1){ 
 head = null; 
 tail = null; 
 length--; 
 return current.element; 
 } 
 
 while(indexCheck++ < length){ 
 previous = current; 
 current = current.next; 
 } 
 
 previous.next = head; 
 tail = previous.next; 
 length--; 
 return current.element; 
 }; 
 
 this.indexOf = function(element){ 
 var current = head, 
 index = 0; 
 
 while(current && index++ < length){ 
 if(current.element === element){ 
 return index; 
 } 
 current = current.next; 
 } 
 
 return false; 
 }; 
 
 this.toString = function(){ 
 var current = head, 
 indexCheck = 0, 
 string = ''; 
 
 while(current && indexCheck < length){ 
 string += current.element; 
 indexCheck++; 
 current = current.next; 
 } 
 
 return string; 
 }; 
 
 this.isEmpty = function(){ 
 return length === 0; 
 }; 
 
 this.getHead = function(){ 
 return head; 
 }; 
 
 this.getTail = function(){ 
 return tail; 
 }; 
 
 this.size = function(){ 
 return length; 
 }; 
} 

文档

JavaScript数据结构之双向链表和双向循环链表的实现

JavaScript数据结构之双向链表和双向循环链表的实现:双向链表和普通链表的区别在于,在链表中,一个节点只有链向下一个节点的链接,而在双向链表中,链接是双向的:一个链向下一个元素,另一个链向前一个元素。 双向链表提供了两种迭代列表的方法:从头到尾,或者反过来。我们也可以访问一个特定节点的下一个
推荐度:
标签: 数据 实现 js
  • 热门焦点

最新推荐

猜你喜欢

热门推荐

专题
Top