[置顶] 用JavaScript来实现链表LinkedList
2016-11-05 16:01
423 查看
好多做web开发的朋友,在学习数据结构和算法时可能比较讨厌C和C++,上学的时候写过的也忘得差不多了,更别提没写过的了。但幸运的是,你会JavaScript啊。我想说学好数据结构和基本算法并非是要我们必须要去书写,算法的工作有专业的职位专业的人来做,但是如果你希望走的更高,这些是必不可少的,比如你学习Redis,如果hashmap等相关结构的话,也只能停留在使用的层次上,永远和优化不能挂钩。我也是个一瓶子不满半瓶子晃悠,和希望快速成长的伙伴们共同加深印象,共同提高吧。
如果你希望学习redis的话,可以看下这个链接 http://www.cnblogs.com/tdws/tag/NoSql/
进入正题
链表是一种动态的数据结构,不同于数组的是,链表分配内存空间的灵活性,它不会像数组一样被分配一块连续的内存。当你想在数组的任意位置,插入一个新值的时候,必须对数组中的各个元素进行相应的位置移动才能达到目标,开销显然是很大的。然而链表的灵活性在于它的每个元素节点分为两部分,一部分是存储元素本身,另一部分是指向下一个节点元素的引用,也可以称为指针,当你要插入数据时,把上一个节点的向下指针指向新数据节点,新数据节点的向下指针指向原有数据。但是链表不像数组那样可以直接通过索引立刻定位,只能通过遍历。
图画的可能是乱了点,就是想突出一下,链表分配内存的动态性,你随时随地,都可以增加和删除,并且内存的不连续性和无索引性。我暂时给链表类定义如下几个方法
一个append追加元素,一个removeAt移除指定位置元素,一个insert在指定位置插入元素,toString输出元素,一个indexOf寻找指定元素的索引。先上代码吧:
如果你希望学习redis的话,可以看下这个链接 http://www.cnblogs.com/tdws/tag/NoSql/
进入正题
链表是一种动态的数据结构,不同于数组的是,链表分配内存空间的灵活性,它不会像数组一样被分配一块连续的内存。当你想在数组的任意位置,插入一个新值的时候,必须对数组中的各个元素进行相应的位置移动才能达到目标,开销显然是很大的。然而链表的灵活性在于它的每个元素节点分为两部分,一部分是存储元素本身,另一部分是指向下一个节点元素的引用,也可以称为指针,当你要插入数据时,把上一个节点的向下指针指向新数据节点,新数据节点的向下指针指向原有数据。但是链表不像数组那样可以直接通过索引立刻定位,只能通过遍历。
图画的可能是乱了点,就是想突出一下,链表分配内存的动态性,你随时随地,都可以增加和删除,并且内存的不连续性和无索引性。我暂时给链表类定义如下几个方法
一个append追加元素,一个removeAt移除指定位置元素,一个insert在指定位置插入元素,toString输出元素,一个indexOf寻找指定元素的索引。先上代码吧:
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); //构造新的元素节点 var current; if (head === null) { //头节点为空时 当前结点作为头节点 head = node; } else { current = head; while (current.next) { //遍历,直到节点的next为null时停止循环,当前节点为尾节点 current = current.next; } current.next = node; //将尾节点指向新的元素,新元素作为尾节点 } length++; //更新链表长度 }; this.removeAt = function (position) { if (position > -1 && position < length) { var current = head; var index = 0; var previous; if (position == 0) { head = current.next; } else { while (index++ < position) { previous = current; current = current.next; } previous.next = current.next; } length--; return current.element; } else { return null; } }; this.insert = function (position, element) { if (position > -1 && position <= length) { //校验边界 var node = new Node(element); current = head; var index = 0; var previous; if (position == 0) { //作为头节点,将新节点的next指向原有的头节点。 node.next = current; head = node; //新节点赋值给头节点 } else { while (index++ < position) { previous = current; current = current.next; } //遍历结束得到当前position所在的current节点,和上一个节点 previous.next = node; //上一个节点的next指向新节点 新节点指向当前结点,可以参照上图来看 node.next = current; } length++; return true; } else { return false; } }; this.toString = function () { var current = head; var string = ''; while (current) { string += ',' + current.element; current = current.next; } return string; }; this.indexOf = function (element) { var current = head; var index = -1; while (current) { if (element === current.element) { //从头节点开始遍历 return index; } index++; current = current.next; } return -1; }; this.getLength = function () { return length; } }
本文为JavaScript基础入门介绍!有问题或意见请发表留言或加Q群:460582514
相关文章推荐
- 简单实现 linkedList 双向链表
- 用单链表实现栈 Linked List implementation of stacks
- 【LeetCode-面试算法经典-Java实现】【092-Reverse Linked List II(反转单链表II)】
- java中链表的实现类LinkedList
- C# 泛型类的实现,链表的封装LinkedListNode
- 自己实现单向链表讨论一下LinkedList的效率
- C实现 LeetCode->Reverse Linked List (双指针大法)(单链表反转)
- C#双向链表LinkedList排序实现方法
- C实现 LeetCode->Linked List Cycle 双指针大法)(单链表是否有环 并计算环长度)
- Palindrome Linked List 判断链表是否回文 栈实现
- 双向链表的C++实现 Implement of Doubly Linked List
- LinkedList链表实现队列应用的简单实例
- C++实现单链表(Singly-Linked List)追加、遍历、删除
- 【LeetCode-面试算法经典-Java实现】【141-Linked List Cycle(单链表中有环)】
- 单链表的实现---SingleLinkedList
- 容器第四课,JDK源代码分析,自己实现LinkedList,双向链表的概念_节点定义
- C实现 LeetCode->Reverse Linked List II (双指针大法)(单链表反转)
- [leetcode]Reverse Linked List II (反转链表值 C语言实现)
- list.c - A linked list by C --- C语言实现的单向链表
- 【LeetCode-面试算法经典-Java实现】【142-Linked List Cycle II(单链表中有环II)】