Mình có 2 class được viết như sau:
public class Node
{
public string Name;
public Node pNext;
public Node pPrev;
public Node(string Name)
{
this.Name = Name;
pNext = null;
pPrev = null;
}
public Node cloneNode()
{
return new Node(Name);
}
}
public class Bucket
{
private string Name;
private Node pHead;
public Bucket(string Name)
{
this.Name = Name;
pHead = null;
}
public void addNode(Node pIn)
{
if (pIn == null)
return;
Node temp = pIn.cloneNode();
if (pHead == null)
pHead = temp;
else
{
temp.pNext = pHead;
pHead.pPrev = temp;
pHead = temp;
}
}
public void resetBucket()
{
this.pHead = null;
}
}
Yêu cầu: không được khởi tạo 2 node có cùng tên. 1 node có thể nằm trong nhiều bucket khác nhau nhưng trong 1 bucket thì các node phải là duy nhất.
Ví dụ: Node A, Node B, Node C thì okay. 2 Node A thì không.
Bucket 1: Node A Node B Node C // thỏa mãn yêu cầu
Bucket 2: Node B, Node C, Node D // thỏa mãn yêu cầu
Bucket 3: Node A, Node A, Node B //không được.
Không được dùng container hay array nên các bạn đừng khuyên mình dùng mấy cái như Hashset hay Dictionary nhé. Lại phải dùng linked list rồi.
Mình không rành C# với garbage collection lắm nên sau đây là câu hỏi của mình:
Vì mỗi node có thể nằm trong nhiều bucket nên khi thêm vào bucket nên mình không thể cứ truyền thẳng node đó vào được. Nếu truyền thẳng thì nó sẽ luôn reference cái node đó. Do đó mình sẽ tạo ra 1 node từ node chủ => lí do tại sao có hàm cloneNode().
Vì gọi new trong hàm cloneNode() nên node sẽ nằm trên heap. Vậy khi mình muốn xóa tất cả các node trong bucket, với cách mình viết như trên thì khi mình gọi clearBucket() các vùng nhớ được cấp cho các Node có được giải phóng không?
Minh họa:
Tập hợp Node: NodeA, NodeB, NodeC
Bucket_1: clone_NodeA, clone_NodeB, clone_NodeC.
Khi mình set pHead trong Bucket_1 là null thì sau khi hàm clearBucket() thực thi xong (ra khỏi scope của hàm) các vùng nhớ được cấp phát cho clone_NodeA, clone_NodeB, clone_NodeC khi gọi cloneNode() trong addNode() có được tự động giải phóng không?