【问题标题】:Remove elements from singly linked list (javascript)从单链表中删除元素(javascript)
【发布时间】:2018-05-23 17:48:35
【问题描述】:

我正在解决 CodeFights 问题,试图从值为 k 的单链表中删除元素。

以下是我所拥有的(l 是列表,k 是值):

function removeKFromList(l, k) {
    //figure out the head of the new list so we can reference it later
    var head = l;

    while (head.value === k){
        head = head.next;
    }

    var node = head;
    var temp = null;

    while (node && node !== null) {
        if (node.next.value === k){
            temp = node.next.next;
            node.next.next = null;
            node.next = temp;
        }
        node = node.next; 
        console.log("+++", head)
    }

    console.log("---", head)  
}

CodeFight 测试演员表是 3 -> 1 -> 2 -> 3 -> 4 -> 5。最终结果应该是 1 -> 2 -> 4 -> 5。但是我的“---”控制台日志不断返回“空”(根据 CodeFights 控制台)。

我的“+++”控制台日志在每个循环中返回正确的头部和元素。

我一直在为此烦恼,知道这里缺少什么吗?

【问题讨论】:

  • 请把list的例子也加进去,作为带值函数的调用。
  • 我包含在测试用例中。该列表已作为 SLL 给出,因此我不必创建一个。希望这会有所帮助
  • 一个问题是第一个节点,您需要将下一个节点指定为列表的开始。这仅适用于通过对象提供的列表。
  • 你的while循环条件应该是while (node && node.next != null)

标签: javascript algorithm linked-list closures singly-linked-list


【解决方案1】:

如果删除第一个节点,则需要返回列表。

那么你需要一个循环来在未找到值时取下一个。

最后你需要检查最后一个节点是否存在,如果找到值,则将下一个节点分配给最后一个下一个属性。

function removeNode(list, value) {
    var node = list,
        last;

    if (node && node.value === value) {
        return node.next;
    }

    while (node && node.value !== value) {
        last = node,
        node = node.next;
    }
    if (last && node.value === value) {
        last.next = node.next;
    }
    return list;
}

var list = { value: 1, next: { value: 2, next: { value: 3, next: { value: 4, next: { value: 5, next: { value: 6, next: { value: 7, next: null } } } } } } };

list = removeNode(list, 5);
console.log(list)

list = removeNode(list, 1);
console.log(list)

list = removeNode(list, 7);
console.log(list)
.as-console-wrapper { max-height: 100% !important; top: 0; }

【讨论】:

    【解决方案2】:

    试试这个:

    function myRemove(l, k){
        if(l == null){
            return l;
        }
        while(l.value == k){
            l = l.next;
        }
        thisNode = l;
        nextNode = thisNode.next;
        while(nextNode != null){
            if(nextNode.value == k){
                thisNode.next = nextNode.next;
                // No more nodes, ie last node was to be removed
                if(thisNode.next == null)
                    break;
            }
            thisNode = thisNode.next;
            nextNode = thisNode.next;       
        }
        return l;
    }
    

    【讨论】:

      【解决方案3】:

      这也可以通过递归来完成:

       function removeKFromList({value, next}, k) {       
         if(value === k){
            return next ? removeKFromList(next, k) : null;
         } else {
            return {
              next : removeKFromList(next),
              value
             };
        }
       }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-10-29
        • 2018-07-08
        • 2017-11-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多