• [JS]實作LinkedList鏈結串列


    由於自身資料結構的基礎薄弱,買了一本JavaScript資料結構與演算法實作的書來看,重新把LinkedList鏈結串列學習了一遍,並用JS實作出來。

    LinkedList鏈結串列

    要存放多個元素,最常用的資料結構可能是陣列,但是在大多數語言中,陣列的大小是固定的,要從陣列中插入項目或移除項目的成本很高,因為必須移動其他元素。
    LinkedList 就解決了這個情況,它存放有順序的元素集合,但不同於陣列,鏈結串列的元素在記憶體中並不是連續放置,每個元素由一個存放元素本身的節點和一個指向下一個元素的指位器組成。

    實作

    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
    101
    102
    103
    104
    105
    106
    107
    108
    function (){

    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;
    }
    current.next = node;
    }
    length++;
    }
    //移除特定位置元素
    this.removeAt = function(position){大专栏  [JS]實作LinkedList鏈結串列n>
    //檢查有無越界
    if(position > -1 && position < length){
    var current = head,
    previous,
    index = 0;
    //移除第一項
    if(position === 0){
    head = current.next;
    }else{
    while(index++ < position ){
    previous = current;
    current = 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;
    }
    node.next = current;
    previous.next = node;
    }
    length++;
    return true;
    }else{
    return false;
    }
    }
    //將list輸出成String
    this.toString = function(){
    var current = head,
    string = '';
    while(current){
    string += current.element + (current.next ? ', ' : '');
    current = current.next;
    }
    return string;
    }
    //查詢元素在第幾項
    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;
    }
    }
  • 相关阅读:
    ASP.NET MVC WebAPI 上传图片实例
    PowerDesigner设计权限控制数据模型
    ASP.NET中使用WebService异步加载数据显示到页面
    C#+Dotnetbar海益ERP数据管理系统
    centos 6.X minimal 系列最小化安装完成后,安装mono和jexus过程小记录
    MVC3/4伪静态 jexus mvc伪静态
    petapoco 使用 MiniProfiler Glimpse监控
    尝试整理出自己的开发框架1
    初尝Brnshop移植到Linux Mono Jexus环境运行
    (转)Android开发出来的APP在手机的安装路径是?
  • 原文地址:https://www.cnblogs.com/lijianming180/p/12376170.html
Copyright © 2020-2023  润新知