我正在尝试编写将删除单链表中重复节点的代码。
只有删除的重复项才会被删除,直到存储在下一个节点中的数字发生变化。
例如,如果输入列表是[ 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 :(得分:1)
在您当前的解决方案中,您尝试同时执行两项操作,跳过n
相同数字并重新排列列表。这使得解决方案比必要的复杂一点。
当你有一个当前节点并且当前节点后面跟着另一个节点时,你可以做的就是循环。
现在在循环中你有两种可能性;
就是这样,不需要对头部参考进行明确的分配。
答案 1 :(得分:0)
我猜这是作业,所以我不想提供完整的解决方案。
直接使用迭代器总是很棘手。您应该考虑使用所需的解决方案创建新的List,而不是使用单个List进行工作。例如,示意性地......
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
当然,如果类/赋值确实要您使用迭代器,请忽略上面的...
答案 2 :(得分: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;
}
}
}