2012-09-29 98 views
-1

我正在尝试编写将删除单个链接列表中的重复节点的代码。
删除的副本只会被删除,直到存储在下一个节点中的号码发生更改。

例如,如果输入列表是[ 0 0 0 0 1 1 0 0 0 3 3 3 1 1 0 ]
输出列表是[ 0 1 0 3 1 0 ]
我试图编写代码并尝试了多件事情。每次我调用函数时,它都会返回原始链表或仅返回原始头和原始尾。
我试图创建一个临时链表并将值存储在该列表中,但它不能正确返回。
我最近的尝试是在下面的代码片段中,只返回原始列表的头部和尾部。
需要删除链接列表中的重复节点

我的问题是,我该如何处理这段代码?我试图将其绘制出来并将其可视化,但它没有帮助。
我不是在寻找代码,只是写在正确的方向。
我认为我现在的代码已经是死胡同了,我可能不得不从头开始重新启动。
开始实现此代码以获得答案的最佳方法是什么?

public void squish() { 

    SListNode current = head; 
    SListNode iterator = current.next; 

    while (iterator != null){ 
     if (current.equals(iterator)){ 
      iterator = iterator.next; 
     } else { 
      if (current.next.equals (null)) { 
       break; 
      } else { 
       head.next = iterator; 
       current = iterator; 
      } 
     } 
    } 
} 
+0

为什么不使用Set? – Egor

+1

@Egor - 这可能是家庭作业.... – debracey

+2

一套将删除所有重复。不只是连续的。而OP似乎需要实现他自己的家庭作业清单。 –

回答

0

我猜这是家庭作业,所以我不想提供完整的解决方案。

直接使用迭代器总是很棘手。您应该考虑使用您想要的解决方案创建一个新列表,而不是使用单个列表工作。例如,示意图...

Create a new empty List for the result 
Initialize prevValue 
Loop over the values in input list 
If the value is not equal to the prevValue 
    add it to the result list 
    update prev value 

当然,如果类/作业真的希望你使用迭代器,忽略上述...

+0

我不必使用迭代器,所以我会尝试这个想法。我首先尝试了这一点,但是我遇到了一些问题,确保将新列表返回到我正在测试的主要功能中。感谢您的代码示意图,希望我能弄明白这一次。 – Hunter

1

在当前的解决方案,你正在尝试做的两件事情在一次,跳过n等号并重新安排你的名单。这使得解决方案比必要的复杂一点。

你可以做的是当你有一个当前节点并且当前节点跟着另一个节点时循环。

现在在循环中你有2种可能性;

  • 或者当前值和下一个值相等,在这种情况下,使当前(下一个)跟随当前下一个的节点相同。
  • 或值不相等,在这种情况下,通过将当前节点设置为其跟随节点来遍历列表。

就是这样,没有明确的头部引用分配应该是必要的。

+0

我试图改变它,但输入函数的列表仍然没有改变。当我阅读我现在写的内容时,似乎并没有实际删除任何节点。
我开始while循环相同,但如果当前==下一个然后更改旁边next.next。
那么如果这不是真的,我设置current = next。对我来说,似乎这实际上并不会改变我想挤压的名单。 – Hunter

+0

@Hunter,我认为比较可能是问题'current == next'永远不会是'true',除非对同一个对象同时出现。你可能想要的是比较'current.value == next.value',假设值是一个整数类型而不是一个字符串。 (还要注意''current.next.equals(null)'在由current.next引用的对象上调用equals()方法来检查你的下一个指针,使用'current.next == null') – rsp

+0

我终于明白,这是我第一次尝试解决问题时遇到的问题。感谢您的帮助 – Hunter

0
public void RemoveDuplicates() 
    { 
     Dictionary<int, int> myDict = new Dictionary<int, int>(); 

     Node cur = head; 

     myDict.Add(head.Data, 1); 
     while (cur.Next != null) 
     { 
      if (myDict.ContainsKey(cur.Next.Data)) 
       cur.Next = cur.Next.Next; 
      else 
      { 
       myDict.Add(cur.Next.Data, 1); 
       cur = cur.Next; 
      } 


     } 
    }