【问题标题】:I am trying to delete duplicates from a linked list, however the duplicates are still remaining我正在尝试从链接列表中删除重复项,但是重复项仍然存在
【发布时间】:2020-04-06 23:43:56
【问题描述】:

我有以下类 ListNode

class ListNode {
    constructor(val) {
        this.val = val
        this.next = null
    }
}

我试图通过将值存储在哈希中来删除重复值,如果存在这些值,则不应使用这些值形成新节点;但是,我所完成的只是当前列表的副本。我不确定我在哈希中做错了什么。我的逻辑结构不正确吗?

const deleteDuplicates = (head) => {
    let newNode = new ListNode('dummy')
    let current = newNode
    let headHash = {}

    while (head) {
        if (headHash[head.val] === undefined) {
            if (newNode.next === null) newNode.next = new ListNode(head.val)
            else {
                newNode = newNode.next
                newNode.next = new ListNode(head.val)
            }
        }
        headHash = (headHash[head.val] || 0) + 1
        console.log(headHash, head.val);
        head = head.next

    }
    return current.next
}

const l = new ListNode(1)
l.next = new ListNode(1)
l.next.next = new ListNode(2)

const l2 = new ListNode(1)
l2.next = new ListNode(1)
l2.next.next = new ListNode(2)
l2.next.next.next = new ListNode(3)
l2.next.next.next.next = new ListNode(3)


console.log(deleteDuplicates(l));
console.log(deleteDuplicates(l2));

【问题讨论】:

    标签: javascript algorithm dictionary linked-list


    【解决方案1】:

    违规行似乎是这一行:

    headHash = (headHash[head.val] || 0) + 1

    您必须将headHash 的当前头值属性分配给一个未定义的值,而不是将整个headHash 分配给一个值。请看下面的代码:

    class ListNode {
      constructor(val) {
        this.val = val;
        this.next = null;
      }
    }
    const deleteDuplicates = (head) => {
      let newNode = new ListNode("dummy");
      let current = newNode;
      let headHash = {};
    
      while (head) {
        if (headHash[head.val] === undefined) {
          if (newNode.next === null) {
              newNode.next = new ListNode(head.val);
          } else {
              newNode = newNode.next;
              newNode.next = new ListNode(head.val);
            }
        }
        // headHash = (headHash[head.val] || 0) + 1 // <- offending line
        headHash[head.val] = (headHash[head.val] || 0) + 1; // You need to assign the value to the headHash's key, not to the headHasn itself.
        head = head.next;
      }
      return current.next;
    };
    
    const l = new ListNode(1);
    l.next = new ListNode(1);
    l.next.next = new ListNode(2);
    
    const l2 = new ListNode(1);
    l2.next = new ListNode(1);
    l2.next.next = new ListNode(2);
    l2.next.next.next = new ListNode(3);
    l2.next.next.next.next = new ListNode(3);
    
    
    
    console.log(deleteDuplicates(l));
    console.log(deleteDuplicates(l2));

    【讨论】:

    • 那行应该是headHash = (headHash[head.val] || 0) + 1 我正在尝试存储当前节点的值,如果该值存在,那么该节点不应该附加到新节点,如果它不存在,如我相信这就是我存储在哈希中的内容,应该添加它。
    • 您将整个 headHash 分配给一个值,您必须将当前节点分配给当前 head 值的哈希属性。如果你运行 sn -p 你会看到重复的列表节点被删除了。
    • 如果我有,我会尝试这样做:Input: 1-&gt;1-&gt;2-&gt;3-&gt;3 我的 headhash 应该是这样的:headhash={1: 2, 2:1,3:2}
    • 啊。我没有意识到你解决了它,我以为你在问我的哈希逻辑是什么。我没想过将节点本身添加到哈希中。感谢您的帮助。
    • 不客气!对不起,我没有意识到你没有意识到我已经发布了一个解决方案,是的,问题是你没有使用散列,你给它分配了字面值而不是分配散列的属性值作为键。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-09-30
    • 2020-04-22
    • 2015-09-30
    • 1970-01-01
    • 2012-11-30
    • 1970-01-01
    相关资源
    最近更新 更多