Возникают проблемы с пониманием логики c этого цикла while - PullRequest
0 голосов
/ 26 марта 2020

Я практикую односвязный список, и у меня возникают проблемы с пониманием логики c одного раздела предоставленного примера кода. Вот весь код:

function Node(data) {
    this.data = data;
    this.next = null;
}

function SinglyList() {
    this._length = 0;
    this.head = null;
}

SinglyList.prototype.add = function(value) {
    var node = new Node(value),
        currentNode = this.head;

    // 1st use-case: an empty list
    if (!currentNode) {
        this.head = node;
        this._length++;

        return node;
    }

    // 2nd use-case: a non-empty list
    while (currentNode.next) {
        currentNode = currentNode.next;
    }

    currentNode.next = node;

    this._length++;

    return node;
};

SinglyList.prototype.searchNodeAt = function(position) {
    var currentNode = this.head,
        length = this._length,
        count = 1,
        message = {failure: 'Failure: non-existent node in this list.'};

    // 1st use-case: an invalid position
    if (length === 0 || position < 1 || position > length) {
        throw new Error(message.failure);
    }

    // 2nd use-case: a valid position
    while (count < position) {
        currentNode = currentNode.next;
        count++;
    }

    return currentNode;
};

SinglyList.prototype.remove = function(position) {
    var currentNode = this.head,
        length = this._length,
        count = 0,
        message = {failure: 'Failure: non-existent node in this list.'},
        beforeNodeToDelete = null,
        nodeToDelete = null,
        deletedNode = null;

    // 1st use-case: an invalid position
    if (position < 0 || position > length) {
        throw new Error(message.failure);
    }

    // 2nd use-case: the first node is removed
    if (position === 1) {
        this.head = currentNode.next;
        deletedNode = currentNode;
        currentNode = null;
        this._length--;

        return deletedNode;
    }

    // 3rd use-case: any other node is removed
    while (count < position) {
        beforeNodeToDelete = currentNode;
        nodeToDelete = currentNode.next;
        count++;
    }

    beforeNodeToDelete.next = nodeToDelete.next;
    deletedNode = nodeToDelete;
    nodeToDelete = null;
    this._length--;

    return deletedNode;
};

Мне трудно понять, пока l oop в последнем методе.

while (count < position) {
        beforeNodeToDelete = currentNode;
        nodeToDelete = currentNode.next;
        count++;
}

Я понимаю, что цель этого кода перебирать список, пока не будет достигнут нужный узел. Но я не понимаю, как этот код достигает этого. Кажется, что он будет сохранять одинаковые значения на каждой итерации l oop вместо поиска по дереву. Значение currentNode меняется каким-то образом, я пропускаю? Любые советы или рекомендации будут с благодарностью:)

1 Ответ

1 голос
/ 26 марта 2020

Nvm. Я решил это. Кажется, код был ошибкой в ​​конце концов. Примером рабочего решения будет:

while(count<position){ 
 currentnode = currentNode.next; 
 beforenodetodelete = currentNode; 
 nodetodelete = currentNode.next;
 count++; 
}
...