Javascript 我正在尝试从链接列表中删除重复项,但是重复项仍然存在

Javascript 我正在尝试从链接列表中删除重复项,但是重复项仍然存在,javascript,algorithm,dictionary,linked-list,Javascript,Algorithm,Dictionary,Linked List,我有下面的类ListNode class ListNode { constructor(val) { this.val = val this.next = null } } 我试图通过将值存储在散列中来删除重复值,如果这些值存在,则不应使用这些值形成新节点;然而,我所做的只是目前清单的一份副本。我不确定我在我的散列中做错了什么。我的逻辑结构是否有误 const deleteDuplicates = (head) => { let n

我有下面的类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));

令人不快的是:

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

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

类列表节点{
构造函数(val){
this.val=val;
this.next=null;
}
}
常量deleteDuplicates=(头)=>{
设newNode=newlistnode(“伪”);
设current=newNode;
让headHash={};
while(head){
if(headHash[head.val]==未定义){
if(newNode.next==null){
newNode.next=新列表节点(head.val);
}否则{
newNode=newNode.next;
newNode.next=新列表节点(head.val);
}
}

//headHash=(headHash[head.val]| | 0)+1/这一行似乎有问题:

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

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

类列表节点{
构造函数(val){
this.val=val;
this.next=null;
}
}
常量deleteDuplicates=(头)=>{
设newNode=newlistnode(“伪”);
设current=newNode;
让headHash={};
while(head){
if(headHash[head.val]==未定义){
if(newNode.next==null){
newNode.next=新列表节点(head.val);
}否则{
newNode=newNode.next;
newNode.next=新列表节点(head.val);
}
}

//headHash=(headHash[head.val]|||0)+1//该行应该是
headHash=(headHash[head.val]||0)+1
我试图存储当前节点的值,如果该值存在,则不应将该节点附加到新节点,如果该节点不存在,因为我相信这就是我存储在哈希中的内容,应该添加它。如果要将整个headHash赋给一个值,则必须将当前节点赋给c的哈希属性当前头值。如果运行代码段,您将看到重复的列表节点被删除。如果我有:
Input:1->1->2->3->3
我的头哈希应该如下所示:
headhash={1:2,2:1,3:2}
Ahh.我没有意识到你解决了这个问题,我以为你在问我的哈希逻辑是什么。我没有想到将节点本身添加到哈希中。谢谢你的帮助。不客气!对不起,我没有意识到你没有意识到我发布了一个解决方案,是的,问题是你没有使用哈希,你没有分配将文本值分配给它,而不是将值作为键分配给散列的属性。该行应该是
headHash=(headHash[head.val]| | 0)+1
我试图存储当前节点的值,如果该值存在,则不应将该节点附加到新节点,如果该节点不存在,因为我相信这就是我存储在哈希中的内容,应该添加它。如果要将整个headHash赋给一个值,则必须将当前节点赋给c的哈希属性当前头值。如果运行代码段,您将看到重复的列表节点被删除。如果我有:
Input:1->1->2->3->3
我的头哈希应该如下所示:
headhash={1:2,2:1,3:2}
Ahh.我没有意识到你解决了这个问题,我以为你在问我的哈希逻辑是什么。我没有想到将节点本身添加到哈希中。谢谢你的帮助。不客气!对不起,我没有意识到你没有意识到我发布了一个解决方案,是的,问题是你没有使用哈希,你没有分配他将文本值分配给它,而不是将值作为键分配给散列的属性。