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

3 回答 3

1

在您当前的解决方案中,您尝试一次做两件事,跳过n相等的数字并重新排列您的列表。这使得解决方案比必要的复杂一些。

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

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

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

就是这样,不需要对头部引用进行显式分配。

于 2012-09-29T19:58:06.747 回答
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

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

于 2012-09-29T19:46:20.600 回答
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;
            }


        }
    }
于 2014-04-12T21:38:03.080 回答