难以理解此while循环的逻辑

问题描述 投票:0回答:1

我正在练习单链列表,但在理解所提供示例代码的一部分逻辑时遇到了麻烦。这是完整的代码:

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

我在理解最后一种方法中的while循环时遇到困难。

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

我知道这段代码的目的是遍历列表,直到到达所需的节点为止。但是我不明白这段代码是如何实现的。似乎它将在循环的每次迭代中保留相同的值,而不是遍历树。 currentNode的值是否以某种方式丢失了?任何提示或建议,将不胜感激:)

javascript data-structures singly-linked-list
1个回答
0
投票

Nvm。我解决了似乎代码毕竟是一个错误。一个可行的解决方案的示例是:

while(count<position){ 
 currentnode = currentNode.next; 
 beforenodetodelete = currentNode; 
 nodetodelete = currentNode.next;
 count++; 
}
© www.soinside.com 2019 - 2024. All rights reserved.