单向链表

  • 新增 append(elem) 链表尾部添加新项
  • 插入 insert(elem,position) 在特定的位置插入元素
  • 移除 removeAt 重列表中特定的位置移除
  • isEmpty 判断链表是否为空
  • indexOf(elem) 返回元素在列表中的位置
  • size 返回链表长度
  • toString 返回所有链表元素的拼接字符串
  1. function LinkedList(){
  2. // 链表实现
  3. var length = 0; // 链表元素个数
  4. var head = null; // 链表开头元素
  5. // 链表单元类
  6. function Node(elem){
  7. this.elem = elem;
  8. this.next = null;
  9. }
  10. /**
  11. * @function append 添加元素
  12. * @argument {elem}
  13. * @returns
  14. */
  15. this.append = function(elem){
  16. var node = new Node(elem);
  17. var current; // 链表的当前一个
  18. // 如果链表中没有其他元素
  19. if(!head){
  20. head = node;
  21. }else{
  22. // 遍历链表 添加到最后一个
  23. current = head;
  24. while(current.next){ // 重第一个开始遍历找到最后一个再添加上
  25. current = current.next;
  26. }
  27. current.next = node;
  28. }
  29. // 更新链表长度
  30. length =length+1;
  31. }
  32. /**
  33. * @function moveAt
  34. * @argument {position} number
  35. * @returns {any}
  36. */
  37. this.moveAt = function(position){
  38. // 边界判断
  39. if(position>-1&&position<length){
  40. var current; // 当前元素
  41. var pre; // 前一个元素
  42. var index = 0; // 迭代指针
  43. // 如果是第一个
  44. if(position === 0){
  45. head = head.next;
  46. }else{
  47. current = head;
  48. while(index < position){
  49. pre = current;
  50. current = current.next;
  51. index ++;
  52. }
  53. // 将前一个元素和后一个元素连接起来
  54. pre.next = current.next;
  55. }
  56. length --;
  57. return current.elem;
  58. }else{
  59. return null;
  60. }
  61. }
  62. /**
  63. * @function insert
  64. * @argument {elem,position}
  65. * @returns {boolean}
  66. */
  67. this.insert = function(elem,position){
  68. var node = new Node(elem);
  69. var index = 0; // 迭代指针
  70. var current = head; // 当前元素
  71. var pre; // 前一个元素
  72. // 边界判断
  73. if(position>-1&&position<length){
  74. // 当插入的位置是0
  75. if(position === 0){
  76. node.next = current;
  77. }else{
  78. while(index<position){
  79. pre = current;
  80. current = current.next;
  81. index ++;
  82. }
  83. node.next = current;
  84. pre.next = node;
  85. };
  86. // 更新长度
  87. length ++;
  88. return true;
  89. }else{
  90. return false;
  91. }
  92. }
  93. /**
  94. * @function toString
  95. * @returns {string}
  96. */
  97. this.toString = function(){
  98. var current = head;
  99. var str = '';
  100. while(current){
  101. str += `${current.elem} `;
  102. current = current.next;
  103. }
  104. return str;
  105. }
  106. /**
  107. * @function indexOf
  108. * @argument {elem}
  109. * @returns {number}
  110. */
  111. this.indexOf = function(elem){
  112. var index = 0; // 迭代指针
  113. var current = head;
  114. while(current){
  115. if(current.elem === elem){
  116. return index;
  117. }
  118. index ++;
  119. current = current.next;
  120. }
  121. return -1;
  122. }
  123. /**
  124. * @function isEmpty
  125. * @returns {boolean}
  126. */
  127. this.isEmpty = function(){
  128. return length === 0;
  129. }
  130. /**
  131. * @function size
  132. * @returns {number}
  133. */
  134. this.size = function(){
  135. return length;
  136. }
  137. /**
  138. * @function getHead
  139. * @returns {object}
  140. */
  141. this.getHead = function(){
  142. return head;
  143. }
  144. }
  145. var linklist = new LinkedList();
  146. linklist.append(1);
  147. linklist.append(2);
  148. linklist.append(3);
  149. linklist.append(4);
  150. // console.log(linklist.getHead())
  151. linklist.insert(31,2);
  152. console.log(linklist.toString())
  153. console.log(linklist.size())
  154. console.log(linklist.isEmpty())
  155. console.log(linklist.moveAt(2))