1

有一段时间我一直在反对这个。我无法弄清楚为什么该节点不会从我的链表中删除。我有一个链接列表,用于存储我浏览并渲染每个图像的图像。问题是它们仍在被渲染而不是被移除。我的代码有问题吗?对于 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);
        }
4

1 回答 1

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
    }
}

测试

于 2012-09-06T02:55:44.190 回答