链表 --js实现

1.链表的概念

列表存储的是有序元素集合,不同于数组,链表的中的元素在内存中并不是连续放置的。每个元素是由一个存储元素本身的节点和指向下一个元素的引用(指针或链接)组成。
通过的这个概念的我们可以分析出
某一个节点大概是:

node:{
value:xxx,
next:node
}

除此之外还有length保存着链表的长度,head表示第一个元素在哪里
所以添加元素

2.1添加元素

function LinkedList(){
  let Node = function(element){
    this.element = element
    this.next = null
  }
  let length = 0
  let head = null
  // 向列表尾部添加一个新的项
  this.append = function(element){
    let node = new Node(element), current
    if(head === null) {//列表中第一个节点
      head = node
    }else{
      current = head
      // 循环列表直到找到最后一项
      while(current.next){
        current = current.next
      }
      current.next = node
    }
    length++
  }
  this.print = function(){
  console.log(head)
  }
}
image.png

2.2移除某一个位置

在数组中删除某一项元素是:把第n项的值删除,第n+1项以及n+1项之后的项全部向前移动一位
在链表中删除某一项元素是:把第n-1项的next指向n+1,则自动把第n项删除了
代码实现:

this.remove=function(position){
  if(position>=0&&position<length){
      let current = head
      let prev
  
      if(position===0){
      head = current.next 
      }else{
      let index = 0  
      while(index<position){
          prev = current  //现任变前任
          current = current.next //后任变现任
          index++
        }
       prev.next = current.next // 断掉current
       length--
       return current
      }
    }else{
    return null
   }
}
2.3向指定位置插入新项

与2.2类似,首先需要判断这个位置是不是越界的,index不能在length之外,和0之前,然后通过循环找到position。

this.insert=function(position,element){
  if(position<=length&&position>=0){
      let current,prev,index = 0
      let node = new Node(element)
      if(position === 0){ // 位置为head则只需要改变head的值,和指针
        current = head
        head = node
        head.next = current
      }else{
        current = head
        while(index<position){
          prev = current
          current = current.next
          index++
        }
        prev.next = node
        node.next = current
        length++
        return node
      }
    }else{
      return null
    }  
}

最后:所有方法的实现

function LinkedList () {
  let Node = function (element) {
    this.element = element
    this.next = null
  }
  let length = 0
  let head = null
  // 向列表尾部添加一个新的项
  this.append = function (element) {
    let node = new Node(element), current
    if (head === null) {//列表中第一个节点
      head = node
    } else {
      current = head
      // 循环列表直到找到最后一项
      while (current.next) {
        current = current.next
      }
      current.next = node
    }
    length++
  }
  // 向列表的特定位置插入一个新的项
  this.insert = function (position, element) {
    if (position <= length && position >= 0) {
      let current, prev, index = 0
      let node = new Node(element)
      if (position === 0) { // 位置为head则只需要改变head的值,和指针
        current = head
        head = node
        head.next = current
      } else {
        current = head
        while (index < position) {
          prev = current
          current = current.next
          index++
        }
        prev.next = node
        node.next = current
        length++
        return node
      }
    } else {
      return null
    }
  }
  // 从列表的特定位置移除一项
  this.removeAt = function (element) {
    let index = 0
    let current = head
    let prev
    while (current) {
      prev = current
      current = current.next
      if (current.element === element) {
        prev.next = current.next
        return current
      }
      current = current.next
      index++
    }
    return null
  }
  // 从列表中移除一项
  this.remove = function (position) {
    if (position >= 0 && position < length) {
      let current = head
      let prev

      if (position === 0) {
        head = current.next
      } else {
        let index = 0
        while (index < position) {
          prev = current  //现任变前任
          current = current.next //后任变现任
          index++
        }
        prev.next = current.next // 断掉current
        length--
        return current
      }
    } else {
      return null
    }
  }
  // 返回元素在列表中的索引
  this.indexOf = function (element) {
    let index = 0
    let current = head
    while (current) {
      if(current.element === element){
         return index

      } 
      current = current.next
      index++
    }
    return null
  }
  // 如果链表不存在任何元素返回true
  this.isEmpty = function () {
    if (head) {
      return false
    }
    return true
  }
  // 返回列表包含的元素个数
  this.size = function () {
    return length
  }
  // 
  this.getHead = function () {
    return head
  }
  this.toString = function () {
    return this.toString()
  }
  this.print = function () {
    console.log(head)
  }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 160,026评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,655评论 1 296
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,726评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,204评论 0 213
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,558评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,731评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,944评论 2 314
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,698评论 0 203
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,438评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,633评论 2 247
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,125评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,444评论 3 255
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,137评论 3 238
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,103评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,888评论 0 197
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,772评论 2 276
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,669评论 2 271

推荐阅读更多精彩内容