根据值从链接列表中删除节点

时间:2018-10-12 20:18:45

标签: javascript data-structures linked-list nodes

我正在解决一个Hackerrank问题,并且试图删除所有大于特定值的节点。

这是他们的基本实现方式

const SinglyLinkedListNode = class{
  constructor(value) {
    this.value = value;
    this.next = null;
  }
};

const SinglyLinkedList = class {
  constructor() {
    this.head = null;
    this.tail = null;
  }

  insertNode(value) {
    const node = new SinglyLinkedListNode(value);
    if(!this.head) {
      this.head = node;
    } else {
      this.tail.next = node;
    }
    this.tail = node;
  }
};

我的removeNodes函数如下...

SinglyLinkedList.prototype.removeNodes = function(listHead, x){
  let currentNode = listHead;

  while(currentNode !== null && currentNode.next !== null) {
    let next = currentNode.next;
    while (next !== null && next.value > x) {
      next = next.next
    }
    currentNode.next = next
    if(currentNode.next === null) {
      break;
    }
  }
  return currentNode
}

参数为:listhead-对根节点的引用,x-用于过滤链表的整数值

因此,例如,LL为1-> 2-> 4-> 3-> 5,并且我需要删除所有大于x(3)的节点并保持LL顺序的完整性。 结果应为1-> 2-> 3。

我对为什么一直得到this.tail.value = 5而不是为什么感到困惑 this.tail.value = 3,this.tail.next = null。

这是REPL

1 个答案:

答案 0 :(得分:2)

由于必须tail进行显式重写,否则将保留对未链接节点的引用。在运行该功能之前,列表如下:

  list: head                                   tail
           1    ->    2   ->    3  ->    4    ->  5

,尽管未链接,但尾巴仍指向5:

 list: head                                  tail
         1    ->    2   ->    3             5

要解决此问题,只需在函数末尾重写尾巴即可:

 return this.tail = currentNode;

此外,您还必须遍历列表,因此添加

 currentNode = currentNode.next;

位于外部while的末尾。