javascript中的循环链表

时间:2014-07-17 10:42:09

标签: javascript linked-list circular-list

我正在尝试在javascript中实现循环链​​接列表。 我只是想知道它是在javascript中实现这个的正确方法吗? 是否有任何内存泄漏或无限的对象创建?

function LinkedList() {
    this.Node = null;
    this.count = 0;
    this.head = null;
};

LinkedList.prototype.append = function (value) {
    // create new node
    var node = this.createNode(value);
    console.log(value);
    if (this.head == null) {
        this.Node = node;
        this.Node.next = null;
        this.head = this.Node;
    } else {
        var ptr = this.Node;
        while (ptr.next != null) {
            ptr = ptr.next;
        }
        ptr.next = node;
    }
    this.count++;
};

LinkedList.prototype.getSize = function () {
    console.log(this);
};

LinkedList.prototype.close = function () {
    var ptr = this.head;
    while (ptr.next != null) {
        ptr = ptr.next;
    }
    ptr.next = this.head;
};

LinkedList.prototype.createNode = function (value) {
    var node = {};
    node.value = value;
    node.next = null;
    return node;
};

var li = new LinkedList();
li.append(1);
li.append(2);
li.append(3);
li.append(4);
li.close();
li.getSize();

当我检查控制台时,它显示为head包含一个节点,该节点包含另一个节点等。 它是它们存储的参考或实际对象吗?

2 个答案:

答案 0 :(得分:1)

你执行追加功能的方式对我来说似乎有些缺陷......因为在它执行之后,你的列表处于不一致的状态。您需要调用close()才能正确设置所有内容。我建议你可以改变append()函数来动态更新头部和尾部;因此你不需要调用close()。

下面是我如何实现append()方法(基本上只是稍微修改你的代码):

LinkedList.prototype.append = function(value) {
  var node = {
        value: value,
        next: this.head
    };//cricular node
  if (this.count === 0) {
    this.head = {};
    this.head.value = value;
    this.head.next = this.head;
    this.tail = this.head;
  } else {
    this.tail.next = node;
    this.tail = node;
  }
  this.count++;
};

答案 1 :(得分:0)

getCircular(start){
        let i=0,j=0;
        let secondHead = this.head;
        let pointer = this.head;
        let pointer2 = secondHead;
        while(i<start){
            let temp1 = pointer.next;
            pointer = temp1;
            i++;
        }
        this.head = pointer;
        this.tail.next = pointer2;
        while(j<start-1){
            let temp2 = pointer2.next;
            pointer2 = temp2;
            j++;
        }
        this.tail = pointer2;
        this.tail.next = null;
        return this;
    }

假设已经有一个列表,例如:Kohli-> Dhoni-> Yuvi-> Sharma-> Dhawan, 而您传递的索引为2,则结果将类似于: Yuvi-> Sharma-> Dhawan-> Kohli-> Dhoni

然后您的呼叫应类似于:ll.getCircular(2); // ll是一个对象,例如