我正在尝试在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包含一个节点,该节点包含另一个节点等。 它是它们存储的参考或实际对象吗?
答案 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是一个对象,例如