资讯专栏INFORMATION COLUMN

前端面试总结--数据结构与算法四

superPershing / 2790人阅读

摘要:链表前端的面试中,链表还是经常会被问到。这种数据结构非常方便,提供了便利店语法来访问它的元素。参考书籍推荐一个找组件的轮子工厂前端面试总结数据结构与算法一前端面试总结数据结构与算法二前端面试总结数据结构与算法三

链表

前端的面试中,链表还是经常会被问到。所以熟悉链表的结果以及链表操作的方法还是很重要的。
说道存储多个元素,数组可能是最常用的数据结构。这种数据结构非常方便,提供了便利店[]语法来访问它的元素。但是数组的缺点就是对元素进行插入或者删除操作的成本很高,需要移动元素。
链表存储有序的元素集合,但不同于数组,链表中的元素在内存中并不是连续放置的。每个元素由一个存储元素本身的节点和一个指向下一个元素的引用组成。链表的一个好处在于,增加或删除元素的时候不需要移动其它元素。数组的另一个细节是可以直接访问任何位置的任何元素,而要访问链表中间的一个元素,需要从起点开始迭代列表直到找到所需的元素。

创建链表
function LinkedList(){
    var Node = function(element){
        this.element = element;
        this.next = null;
    }
    var length = 0;
    var head = null;
}

链表的方法

append(element) -- 向链表尾部添加一个新的项
insert(position, element) -- 向链表的特定位置插入一个新的项
remove(element) -- 从链表中移除元素
indexOf(element) -- 返回元素在链表中的索引。如果链表中没有该元素则返回-1
removeAt(position) -- 从链表的特定位置移除一项
isEmpty() -- 如果链表中不包含任何元素,返回true,如果链表长度大于0返回false
size() -- 返回链表包含的元素个数

链表的完整代码
function LinkedList(){
        var Node = function(element){
            this.element = element;
            this.next = null;
        }
        var length = 0;
        var head = null;
        
       this.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++;
       };
       
       this.removeAt = function(position){
           if(position > -1 && position < length){
               var current = head,
               previous,
               index = 0;
               
               if(position === 0){
                   head = current.next;
               } else {
                   while(index++ < pisition){
                       previous = current;
                       current = current.next;
                   }
                   previous.next = current.next;
               }
               length--;
               
               return current.element;
           } else {
               return null;
           }
       };
       
       this.insert = function(position, element){
           if(position >= 0 && position <= length){
               var node = new Node(element),
               current = head,
               previous,
               index = 0;
               
               if(position === 0){
                   node.next = current;
                   head = node;
               } else {
                   while(index++ < position){
                       previous = current;
                       current = current.next;
                   }
                   previous.next =node;
                   node.next = current;
               }
               
               length++;
               
               return true;
           } else {
               return false;
           }
       };
       
       this.indexOf = function(element){
           var current = head, index = 0;
           while(current){
               if(element === current.element){
                   return index;
               }
               index++;
               current = current.next;
           }
           return -1;
       };
       
       this.remove = function(element){
           var index = this.indexOf(element);
           return this.removeAt(index);
       }
       
       this.isEmpty = function(){
           return length === 0;
       }
       
       this.size = function(){
           return length;
       }
       
       this.getHead = function(){
           return head;
       }
       
 }
 
双向链表

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

function DoublyLinkedList(){
    var Node = function(element){
        this.element = element;
        this.next = null;
        this.prev = null;
    };
    var length = 0;
    var head = null;
    var tail = null;
    
    this.insert = function(position, element){
        if(position >= 0 && 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.previous = node;
                    head = node;
                }
            } else if(position === length){
                current = tail;
                current.next = node;
                node.previous = current;
                tail = node;
            } 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,
            previous,
            index = 0;
            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 null;
        }
    }
}


参考书籍:Learning Javascript Data Structures and Algorithms

推荐一个找vue,angular组件的轮子工厂

前端面试总结--数据结构与算法一
前端面试总结--数据结构与算法二
前端面试总结--数据结构与算法三

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/88499.html

相关文章

  • 前端面试总结--数据结构算法

    摘要:结构的实例的方法,用于对每个成员执行某种操作,没有返回值。参考和数据结构推荐一个找组件的轮子工厂前端面试总结数据结构与算法一前端面试总结数据结构与算法二前端面试总结数据结构与算法三前端面试总结数据结构与算法四 集合 集合是由一组无序且唯一的项组成。这个数据结构使用了与有限集合相同的数学概念。 创建一个集合 function Set(){ var items = {}; } ...

    xuexiangjys 评论0 收藏0
  • CSS技巧

    摘要:技巧使你的更加专业这是上关于技巧的一篇译文,另外你也可以在本项目看到原文。列举了一些很实用的技巧,比如给空内容的标签添加内容,逗号分隔列表等等。排序算法看源码,把它背下来吧排序算法的封装。主要帮助初学者更好的掌握排序算法的实现。 成为专业程序员路上用到的各种优秀资料、神器及框架 成为一名专业程序员的道路上,需要坚持练习、学习与积累,技术方面既要有一定的广度,更要有自己的深度。 Java...

    DangoSky 评论0 收藏0
  • CSS技巧

    摘要:技巧使你的更加专业这是上关于技巧的一篇译文,另外你也可以在本项目看到原文。列举了一些很实用的技巧,比如给空内容的标签添加内容,逗号分隔列表等等。排序算法看源码,把它背下来吧排序算法的封装。主要帮助初学者更好的掌握排序算法的实现。 成为专业程序员路上用到的各种优秀资料、神器及框架 成为一名专业程序员的道路上,需要坚持练习、学习与积累,技术方面既要有一定的广度,更要有自己的深度。 Java...

    zgbgx 评论0 收藏0
  • 帝都寒冬一年经验前端面试总结

    摘要:不过幸运的是所有面试的公司都给了,在这里总结下经验吧。这里推荐下我当时看的一篇的面经,木易杨老师写的大厂高级前端面试题汇总。 前言 本人毕业一年,最近陆续面试了头条、瓜子、360、猿辅导、中信银行、老虎等公司,由于最近比较寒冬而且招1-3年的并不多,再加上自己对公司规模和位置有一定要求,所以最后合适的也就这几家了。不过幸运的是所有面试的公司都给了offer,在这里总结下经验吧。掘金:h...

    Scott 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<