设计链表 leetcode

 

 单链表

class MyLinkedList {
  constructor () {
    this.data = null
  }
  // 获取链表中第 index 个节点的值。如果索引无效,则返回-1
  get (index) {
    let curr = this.data
    for (let i = 0; i < index; i++) {
      if (!curr) break
      curr = curr.next
    }
    return curr ? curr.val : -1
  }
  // 在链表的第一个元素之前添加一个值为 val 的节点。插入后,新节点将成为链表的第一个节点
  addAtHead (val) {
    this.data = { val, next: this.data }
  }
  // 将值为 val 的节点追加到链表的最后一个元素
  addAtTail (val) {
    let curr = this.data
    if (!curr) return this.data = { val, next: null }
    while (curr.next) {
      curr = curr.next
    }
    curr.next = { val, next: null }
  }
  // 在链表中的第 index 个节点之前添加值为 val  的节点。如果 index 等于链表的长度,则该节点将附加到链表的末尾。如果 index 大于链表长度,则不会插入节点。如果index小于0,则在头部插入节点
  addAtIndex (index, val) {
    if (index <= 0) return this.addAtHead(val)
    let curr = this.data
    index--
    while (index && curr.next) {
      index--
      curr = curr.next
    }
    if (index > 0) return
    let tmp = curr.next
    curr.next = { val, next: tmp }
  }
  // 如果索引 index 有效,则删除链表中的第 index 个节点
  deleteAtIndex (index) {
    let curr = this.data, prev = null
    if (!curr) return
    if (index === 0) return this.data = curr.next
    while (index && curr.next) {
      index--
      prev = curr
      curr = curr.next
    }
    if (index > 0) return
    prev.next = curr.next
  }
}

 

双链表

class MyLinkedList {
  constructor () {
    this.data = null
  }
  get(index) {
    if (index < 0) return -1
    let curr = this.data
    while (index > 0 && curr) {
      curr = curr.next
      index--
    }
    return curr ? curr.val : -1
  }
  addAtHead(val) {
    this.data = {
      val, next: this.data, prev: null
    }
    if (this.data.next) this.data.next.prev = this.data
  }
  addAtTail(val) {
    if (this.data) {
      let curr = this.data
      while (curr.next) {
        curr = curr.next
      }
      curr.next = { val, next: null, prev: curr}
    } else {
      this.data = { val, next: null, prev: null }
    }
  }
  addAtIndex(index, val) {
    if (index <= 0) return this.addAtHead(val)
    let curr = this.data
    for (let i = 0; i < index - 1; i++) {
      if (!curr || !curr.next) return null
      curr = curr.next
    }
    if (!curr) return null
    let temp = curr.next
    curr.next = {
      val, prev: curr, next: curr.next
    }
    if (temp) temp.prev = curr.next
  }
  deleteAtIndex(index) {
    if (index < 0) return null
    let curr = this.data
    while (index > 0) {
      if (!curr) return null
      curr = curr.next
      index--
    }
    if (!curr) return null
    if (!curr.prev && !curr.next) {
      this.data = null
    } else if (!curr.prev) {
      curr.next.prev = curr.prev
      this.data = curr.next
    } else if (!curr.next) {
      curr.prev.next = null
    } else {
      curr.prev.next = curr.next
      curr.next.prev = curr.prev
    }
  }
}

 

posted @ 2021-09-22 16:25  jerryfish  阅读(32)  评论(0编辑  收藏  举报