循环链表

很久没有接触数据结构和算法了,可是这些在面试中仍是须要的因此打算从新复习下 今天打算用js来实现循环链表,看下别人怎么实现,发现不多使用js实现的,并且实现有点问题在对head节点进行删除或者插入修改引用有问题,因此打算本身来实现下加深印象。
下面是实现的主要代码:node

function CirLinkList() {
  function Node(element) {
    this.element = element;
    this.next = null;
  }
  var length = 0;
  var head = null, tail = null;
  this.append = function(element) {
    var node = new Node(element), current;
    if (!head) {
      head = node;
      head.next = head;
      tail = head;
    } else {
      current = head;
      while (current.next !== head) {
        current = current.next;
      }
      current.next = node;
      tail = node;
      node.next = head;
    }
    length++;
    return true;
  }
  this.insert = function(position,element) {
    var node = new Node(element), current;
    if (position > -1 && position < length) {
      var index = 0,
      current = head;
      if (position === 0) {
        node.next = head;
        tail.next = node;
        head = node;
      } else {
        while (index++ < position) {
          current = current.next;
        }
        node.next = current.next;
        current.next = node;
      }
      length++;
      return true
    } else {
      return false;
    }
  }
  this.remove = function(element) {
    if (element === head.element) {
      if (length === 1) {
        head = null;
      } else {
        tail.next = head.next;
        head = tail.next;
      }
      length--;
      return true;
    } else {
      current = head;
      while (current.next !== head) {
        if (current.next.element === element) {
          current.next = current.next.next;
          if (current.next === head) tail = current;
          length--;
          return true;
        }
        current = current.next;
      }
    }
    return false;
  }
  this.getHead = function() {
    return head;
  }
  this.size = function() {
    return length;
  }
  this.isEmpty = function() {
    return head ? false : true;
  }
}

let cirLink = new CirLinkList();
let i = 1;
cirLink.append(1);
cirLink.append(2);
cirLink.insert(0, 3);
cirLink.remove(3);
cirLink.insert(0, 0);
cirLink.append(3)
let current = cirLink.getHead();
while (current) {
  console.log(current.element);
  if (i === 6) break;
  i++;
  current = current.next;
}
复制代码

遍历结果0, 1, 2, 3, 0, 1面试

相关文章
相关标签/搜索