• 使用 JavaScript 实现链表


    代码:

      1 <!doctype html>
      2 <html lang="en">
      3 <head>
      4     <meta charset="UTF-8">
      5     <title>Document</title>
      6 </head>
      7 <body></body>
      8 <script>
      9     function LinkedList() {
     10         //需要插入链表的元素
     11         var Node = function(element) {
     12             this.element = element;//元素的值
     13             this.next = null;//指向下一个节点项的指针
     14         };
     15 
     16         var length = 0;//链表的长度
     17         var head = null;//链表中第一个节点(的引用)
     18 
     19         //向链表尾部追加元素
     20         this.append = function(element) {
     21             
     22             var node = new Node(element), current;
     23 
     24             if(head === null) {
     25                 //当链表为空时
     26                 head = node;
     27             } else {
     28                 //要从第一个元素找起
     29                 current = head;
     30                 
     31                 //循环链表,直到找到最后一项
     32                 while(current.next) {
     33                     current = current.next;
     34                 }
     35 
     36                 //把元素插入到链表的末尾
     37                 current.next = node;
     38             }
     39 
     40             length++;
     41         };
     42 
     43         //从链表中根据位置移除元素并返回该元素
     44         this.removeAt = function(position) {
     45             if (position > -1 && position < length) {
     46                 var current = head,
     47                     previous,
     48                     index = 0;
     49 
     50                 //移除第一项
     51                 if(position == 0) {
     52                     head = current.next;
     53                     return current.element;
     54                 }else{
     55                     while(index++ < position){
     56                         previous = current;//删除指定位置前的一个元素
     57                         current = current.next;
     58                     }
     59                     previous.next = current.next;
     60                     length--;
     61                 }
     62                 return current.element;
     63             }else{
     64                 return null;
     65             };
     66         }
     67 
     68         //从链表中根据值移除元素
     69         this.remove = function(element){
     70             var index = this.indexOf(element);
     71             return this.removeAt(index);
     72         };
     73 
     74         //在任意位置插入一个元素
     75         this.insert = function(position, element) {
     76             if(position > -1 && position <= length) {
     77                 var node = new Node(element),
     78                     current = head,
     79                     previous,
     80                     index = 0;
     81 
     82                 if(position === 0){ //在第一个位置添加
     83                     node.next = current;
     84                     head = node;
     85                 }else{
     86                     while(index++ < position) {
     87                         previous = current;
     88                         current = current.next;
     89                     }
     90                     node.next = current;
     91                     previous.next = node;
     92                 }
     93                 length++;
     94                 return true;
     95             }else{
     96                 return false;
     97             }
     98         };
     99 
    100         //找到并返回一个元素的位置,如果元素不存在,返回-1
    101         this.indexOf = function(element) {
    102             var current = head,
    103                 index = 0;
    104 
    105             while(current) {
    106                 if(element === current.element) {
    107                     return index;
    108                 }
    109                 index++;
    110                 current = current.next;
    111             }
    112 
    113             return -1;
    114         };
    115 
    116         //判断链表是否为空
    117         this.isEmpty = function() {
    118             return length === 0;
    119         };
    120 
    121         //返回链表的长度
    122         this.size = function() {
    123             return length;
    124         };
    125 
    126         //查看链表中元素的值(转换为字符串)
    127         this.toString = function() {
    128             var current = head,
    129                 string = '';
    130 
    131             while(current) {
    132                 string += "," + current.element;
    133                 current = current.next;
    134             }
    135             return string.slice(1);
    136         };
    137 
    138         //返回链表中第一个元素
    139         this.getHead = function() {
    140             return head;
    141         };
    142 
    143         //查看链表(中的元素和指针,以数组形式输出)
    144         this.print = function() {
    145             var current = head,
    146                 list = [];
    147 
    148             while(current) {
    149                 list.push(current);
    150                 current = current.next;
    151             }
    152             return list;
    153         };        
    154     }
    155 
    156     var list = new LinkedList();
    157     list.append(5);
    158     list.append(10);
    159     list.append(7);
    160     list.append(9);
    161     list.append(100);
    162     list.append(-2);
    163     console.log(list.toString());
    164     console.log(list.print());
    165     console.log(list.indexOf(115));
    166     console.log(list.indexOf(5));
    167     console.log(list.indexOf(7));
    168     console.log(list.isEmpty());
    169     console.log(list.size());
    170     console.log(list.getHead());
    171 
    172     console.log(list.removeAt(0));
    173     console.log(list.toString());    
    174     console.log(list.removeAt(1));
    175     console.log(list.toString());
    176 
    177     list.insert(0, 500);
    178     console.log(list.toString());
    179 </script>
    180 </html>

    输出:

  • 相关阅读:
    C++设计模式-Bridge桥接模式
    解决VS2010打开Web页面时经常由于内存较低而导致VS2010自动关闭的问题
    Js继承小结
    MAC上的包管理利器
    Objective-C的hook方案(一): Method Swizzling
    OleContainer操作Excel以二进制方式读写数据库
    复制文件时,如何显示进度条(使用TFileStream一点一点读,或者使用BlockRead,并插入application.ProcessMessages)
    ADO异步查询显示进度条
    D2010 RTTI + Attribute 简单实现ORM
    Delphi默认窗体随想
  • 原文地址:https://www.cnblogs.com/dee0912/p/4989479.html
Copyright © 2020-2023  润新知