【发布时间】:2020-10-13 06:18:40
【问题描述】:
我在网上研究了内置的 LinkedList 是 C# 中的双链表。我还研究了 LinkedList.Remove(LinkedListNode) 方法。但我仍然找不到我的问题的答案。 以下是代码sn-p:
public string DequeueCat()
{
LinkedListNode<string> temp = animals.First;
while (temp != null && temp.Value.Contains("Cat") == false)
{
temp = temp.Next;
}
if (temp!=null && temp.Value.Contains("Cat"))
{
animals.Remove(temp);
return temp.Value;
}
else
{
Console.WriteLine("No more Cats available");
return null;
}
}
变量animals 的类型为LinkedList<string>。
当我们用animals.First 实例化一个新的LinkedListNode<string> 时究竟会发生什么?如LinkedListNode<string> temp = animals.First;。
是否发生深度复制,并且原始 LinkedList(由animals.First 指向)被复制到堆上新位置的temp?
此外,当我们编写animals.Remove(temp) 时,temp LinkListNode 被销毁。并且,从animalsLinkedList 中删除相应的值。
下面是执行animals.Remove(temp)之前的监视窗口-
而且,下面是执行animals.Remove(temp) 之后的监视窗口 -
我的问题是,为什么在执行animals.Remove(temp) 之后temp 被破坏了?此外,如果 temp 已在堆上的单独位置创建(与原始 LinkedList 相比),那么我们如何知道从原始删除 temp,animals LinkedList 将从中删除相应的项目
animalsLinkedList?
以下是整个代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace AnimalShelter
{
class AnimalsShelter
{
//This class will have the following functions:
//Enqueue, DequeueAny, DeQueueDog, DeQueueCat
//Implement queue using C# inbuilt linked list.
LinkedList<string> animals = new LinkedList<string>();
public void Enqueue(string animal)
{
animals.AddLast(animal);
}
public string DequeueAny()
{
LinkedListNode<string> firstAnimal = animals.First;
if (firstAnimal != null)
{
animals.RemoveFirst();
return firstAnimal.Value;
}
else
{
Console.WriteLine("No more animanls left in queue.");
return null;
}
}
public string DequeueDog()
{
LinkedListNode<string> temp = animals.First;
while(temp!=null && temp.Value.Contains("Dog")==false)
{
temp = temp.Next;
}
if(temp!=null && temp.Value.Contains("Dog"))
{
animals.Remove(temp);
return temp.Value;
}
else
{
Console.WriteLine("No more Dogs available");
return null;
}
}
public string DequeueCat()
{
LinkedListNode<string> temp = animals.First;
while (temp != null && temp.Value.Contains("Cat") == false)
{
temp = temp.Next;
}
if (temp!=null && temp.Value.Contains("Cat"))
{
animals.Remove(temp);
return temp.Value;
}
else
{
Console.WriteLine("No more Cats available");
return null;
}
}
}
class Program
{
static void Main(string[] args)
{
AnimalsShelter shelter = new AnimalsShelter();
shelter.Enqueue("Dog1");
shelter.Enqueue("Dog2");
shelter.Enqueue("Cat1");
shelter.Enqueue("Dog3");
shelter.Enqueue("Cat2");
shelter.Enqueue("Cat3");
Console.WriteLine(shelter.DequeueCat());
Console.WriteLine(shelter.DequeueAny());
Console.WriteLine(shelter.DequeueDog());
Console.WriteLine(shelter.DequeueCat());
Console.WriteLine(shelter.DequeueAny());
Console.WriteLine(shelter.DequeueAny());
}
}
}
对此的任何说明都非常感谢。谢谢!
【问题讨论】:
-
@SeanReid,感谢您的指点!所以,当我们说
LinkedListNode<string> temp = animals.First;。temp和animals.First都在堆栈上,它们指向堆上相同的LinkedListNode。正确的?此外,animals变量位于堆栈上,并指向堆上的LinkedList。当我们说animals.Remove(temp)时,temp指向的LinkedListNode从animals中删除。正确的?此外,temp变量和animals变量都在 Stack 上,它们分别指向堆上的LinkedListNode和LinkedList。对吗?
标签: c# doubly-linked-list deep-copy