js 實現單向鏈表

單向鏈表(單鏈表)是鏈表的一種,其特色是鏈表的連接方向是單向的,對鏈表的訪問要經過順序讀取從頭部開始。 經過指針鏈接起來,可是隻能單向遍歷的內存塊。因爲它是單向的,或者說不可逆的,因此咱們能夠把它比做咱們的人生:小學->中學->大學->工做->養老。javascript

實現過程java

var Node = function (data) {
  this.data = data;
  this.next = null;
};

var LList = function () {
  this.firstNode = null;
  this.lastNode = null;
  this.length = 0;
};

LList.prototype = {
  clear: function () {
    this.firstNode = null;
    this.lastNode = null;
    this.length = 0;
  },

  get: function (position) {
    var currentNode = this.firstNode;
    for (var i = 1; i < position + 1; i++) {
      currentNode = currentNode.next;
    }
    return currentNode;
  },
  isEmpty: function () {
    var result = false;
    if (this.length == 0 && this.firstNode == null) {
      result = true;
    }
    return result;
  },
  add: function () {
    if (arguments.length == 1) {
      data = arguments[0];
      var newNode = new Node(data);
      if (this.isEmpty()) {
        this.firstNode = newNode;
      } else {
        this.lastNode.next = newNode;
      }
      this.lastNode = newNode;
      this.length++;
      return true;
    } else if (arguments.length == 2) {
      var isSuccessful = true;
      var position = arguments[0];
      var data = arguments[1];
      if (position < this.length + 1) {
        var newNode = new Node(data);
        if (this.isEmpty()) {
          this.firstNode = newNode;
          this.lastNode = newNode;
        } else if (position == this.length) {
          this.lastNode.next = newNode;
          this.lastNode = newNode;
        } else if (position == 0) {
          newNode.next = this.firstNode;
          this.firstNode = newNode;
        } else {
          var nodeBefore = this.get(position - 1);
          var nodeAfter = nodeBefore.next;
          newNode.next = nodeAfter;
          nodeBefore.next = newNode;
        }
        this.length++;
      } else {
        isSuccessful = false;
      }
      return isSuccessful;
    }
  },
  display: function () {
    var str = '';
    var currentNode = this.firstNode;
    while (currentNode != null) {
      str += currentNode.data + ', '
      currentNode = currentNode.next;
    }
    str = str.substr(0, str.length - 2);
    console.log(str);
  },
  remove: function (position) {
    var result = null;
    if (!this.isEmpty() && (position < this.length)) {
      if (position == 0) {
        result = this.firstNode.data;
        this.firstNode = this.firstNode.next;
        this.lastNode = null;
      } else {
        var nodeBefore = this.get(position - 1);
        var nodeToRemove = nodeBefore.next;
        var nodeAfter = nodeToRemove.next;
        nodeBefore.next = nodeAfter;
        result = nodeToRemove.data;
        if (position == this.length - 1) {
          this.lastNode = nodeBefore;
        }
      }
      this.length--;
    }
    return result;
  },
  set: function (position, data) {
    var isSuccessfule = true;
    if (!this.isEmpty() && (position < this.length)) {
      var desireNode = this.get(position);
      desireNode.data = data;
    } else {
      isSuccessfule = false;
    }
    return isSuccessfule;
  },
  contains: function (data) {
    var found = false;
    var currentNode = this.firstNode;

    while (!found && (currentNode != null)) {
      if (data === currentNode.data) {
        found = true;
      } else {
        currentNode = currentNode.next;
      }
    }
    return found;
  },
  size: function() {
    return this.length;
  },
  reverse: function() {
    var newList = new LList();
    for(var i=this.length-1; i>=0; i--) {
      newList.add(this.get(i).data);
    }
    return newList;
  }
};
相關文章
相關標籤/搜索