Kir*_*ril 8 c# java linked-list
我正在阅读Cracking the Coding Interview,第四版:150编程面试问题和解决方案,我正在尝试解决以下问题:
2.1编写代码以从未排序的链表中删除重复项.关注:如果不允许临时缓冲区,您将如何解决此问题?
我在C#中解决它,所以我创建了自己的Node类:
public class Node<T> where T : class
{
public Node<T> Next { get; set; }
public T Value { get; set; }
public Node(T value)
{
Next = null;
Value = value;
}
}
Run Code Online (Sandbox Code Playgroud)
我的解决方案是遍历列表,然后为每个节点迭代通过列表的其余部分并删除任何重复项(请注意,我没有按照本书的指示实际编译或测试它):
public void RemoveDuplicates(Node<T> head)
{
// Iterate through the list
Node<T> iter = head;
while(iter != null)
{
// Iterate to the remaining nodes in the list
Node<T> current = iter;
while(current!= null && current.Next != null)
{
if(iter.Value == current.Next.Value)
{
current.Next = current.Next.Next;
}
current = current.Next;
}
iter = iter.Next;
}
}
Run Code Online (Sandbox Code Playgroud)
这是本书的解决方案(作者用java编写):
如果没有缓冲区,我们可以使用两个指针进行迭代:"current"执行正常迭代,而"runner"遍历所有先前节点以检查重复.Runner每个节点只能看到一个重复,因为如果有多个重复项,它们就已经被删除了.
public static void deleteDups2(LinkedListNode head)
{
if (head == null) return;
LinkedListNode previous = head;
LinkedListNode current = previous.next;
while (current != null)
{
LinkedListNode runner = head;
while (runner != current) { // Check for earlier dups
if (runner.data == current.data)
{
LinkedListNode tmp = current.next; // remove current
previous.next = tmp;
current = tmp; // update current to next node
break; // all other dups have already been removed
}
runner = runner.next;
}
if (runner == current) { // current not updated - update now
previous = current;
current = current.next;
}
}
}
Run Code Online (Sandbox Code Playgroud)
所以我的解决方案总是寻找当前节点到最后的重复,而他们的解决方案寻找从头到当前节点的重复.我觉得这两种解决方案都会遇到性能问题,具体取决于列表中有多少重复项以及它们的分布方式(密度和位置).但总的来说:我的答案几乎和书中的答案一样好,还是更糟糕?
如果你给一个人一条鱼,他们会吃一天.如果你教一个人钓鱼......
我对实施质量的衡量标准是:
至于你的实施:
| 归档时间: |
|
| 查看次数: |
17324 次 |
| 最近记录: |