存储有序的元素集合,但不同于数组,链表中的元素在内存中不是连续放置的。每个元素由一个存储元素本身的节点和一个指向下一个元素的引用(也称指针或链接)组成。下面通过本文给大家详细介绍下,需要的朋友参考下
最近在看《javascript数据结构和算法》这本书,补一下数据结构和算法部分的知识,觉得自己这块是短板。
链表:存储有序的元素集合,但不同于数组,链表中的元素在内存中不是连续放置的。每个元素由一个存储元素本身的节点和一个指向下一个元素的引用(也称指针或链接)组成。
好处:可以添加或移除任意项,它会按需扩容,且不需要移动其他元素。
与数组的区别:
数组:可以直接访问任何位置的任何元素;
链表:想要访问链表中的一个元素,需要从起点(表头)开始迭代列表直到找到所需的元素。
做点小笔记。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 | 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){ current = current.next } current.next = node } length ++ //更新链表长度 } this .insert = function (position,element){ var node = new Node(element) var current = head var previous var index = 0 if (position>=1 && position<=length){ //判断是否越界 if (position === 0){ //插入首部 node.next = current head = node } else { while (index++ < position){ previous = current current = current.next } node.next = current previous.next = node } length ++ //更新链表长度 return true } else { return false } } 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 .removeAt = function (position){ if (position>-1 && position<length){ //判断是否越界 var current = head var previous var index = 0 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 .remove = function (element){ var index = this .indexOf(element) return this .removeAt(index) } this .isEmpty = function (){ return length == 0 } this .size = function (){ return length } this .toString = function (){ var current = head var string = "" while (current){ string = "," + current.element current = current.next } return string.slice(1) } this .getHead = function (){ return head } } |