从单链表(javascript)中删除元素

时间:2017-12-09 18:55:13

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

我正在执行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 - >但是我的' ---'控制台日志不断返回"清空" (根据CodeFights控制台)。

我的' +++'控制台日志返回每个循环元素的正确头部。

我一直把头发拉过来,知道这里缺少什么吗?

3 个答案:

答案 0 :(得分:0)

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

然后你需要一个循环来获取未找到值的下一个。

最后,您需要检查最后一个节点是否存在以及是否找到该值,然后将下一个节点分配给最后一个下一个属性。

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

答案 1 :(得分:0)

试试这个:

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

答案 2 :(得分:0)

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

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