我的头撞了一会儿。我无法弄清楚为什么节点不会从我的链表中删除。我有一个链表,存储我经历的图像并呈现每个图像。问题是它们仍然被渲染而不是被删除。我的代码有问题吗?对于javascript中的所有其他类型的链接列表,我的代码似乎相同。
编辑添加完整代码,因为它可能有用:
var object_action_holder = function () {
this.skill_id = 0;
this.skill_type = 0;
this.image_src = 0;
this.x_pos = 0;
this.y_pos = 0;
this.turn_off = 0;
this._head = null;
};
object_action_holder.prototype = {
add: function ( skill_id , skill_type , image_src , x_pos , y_pos ) {
var node = {
skill_id:skill_id,
skill_type:skill_type,
image_src:image_src,
x_pos:x_pos,
y_pos:y_pos,
next:null
},
current;
if (this._head === null) {
this._head = node;
} else {
current = this._head;
while (current.next) {
current = current.next;
}
current.next = node;
}
this.skill_id = skill_id;
this.skill_type = skill_type;
this.image_src = image_src;
this.x_pos = x_pos;
this.y_pos = y_pos;
},
remove_node: function ( skill_id ) {
var current = this._head, previous;
if (skill_id != null && current != null ) {
while ( current.skill_id != skill_id ) {
previous = current;
current = current.next;
}
if ( current.skill_id == skill_id )
console.log('found the skill_id');
if (current != null) {
if ( current.next != null ) {
previous.next = current.next;
return current;
}else {
previous = null;
current = null;
return current;
}
}
}
return null;
},
get_action_holder: function () {
var current = this._head;
var object_array = [];
var i = 0;
while (current != null) {
object_array[i] = current;
i++;
current = current.next;
}
return object_array;
},
}
呈现
var action_image = main.action_holder.get_action_holder();
for(var i = 0; i < action_image.length; i++) {
main.game_handle.drawImage ( action_image[i].image_src , ( action_image[i].x_pos * 16 ) + main.player_x - ( main.game_x_pos * 16 ) , ( action_image[i].y_pos * 16 ) + main.player_y - ( main.game_y_pos * 16 ) );
if ( action_image[i].turn_off == true )
delete main.action_holder.remove_node(action_image[i].skill_id);
}
答案 0 :(得分:2)
试试这个:
if (current != null) {
if (previous) {
previous.next = current.next;
}
if (current.next) {
current.next.previous = previous;
}
if (current == this._head) { // if the first node is removed, reset head to the next node
this._head = current.next;
}
return current;
}
内部add_node
方法:
if (this._head === null) {
this._head = node;
} else {
current = this._head;
while (current.next) {
current = current.next;
}
if (current != node) { // avoid circular reference
current.next = node;
node.previous = current; // set previous of the new node
}
}