User
User

Reputation: 649

Javascript linked-list problems with deleting

Been banging my head against this for a while. I cant figure out why the node will not remove from my linked list. I have a linked-list that stores images that I go through and render each one. Problem is they are still being rendered and not removed. Is there any problems with my code? My code seems the same for all other type of linked-lists in javascript.

edit Adding full code since it might be useful:

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

rendering

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

Upvotes: 1

Views: 210

Answers (1)

timidboy
timidboy

Reputation: 1722

Try this:

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

Inside add_node method:

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

Test

Upvotes: 2

Related Questions