1

しばらくこれに頭を悩ませていました。リンクされたリストからノードが削除されない理由がわかりません。私が通過してそれぞれをレンダリングする画像を保存するリンクリストがあります。問題は、それらがまだレンダリングされており、削除されていないことです。コードに問題はありますか? 私のコードは、javascript の他のすべてのタイプのリンク リストでも同じようです。

edit役に立つかもしれないので、完全なコードを追加します:

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 に答える