gpt4 book ai didi

c# - c#链表中的删除操作

转载 作者:太空宇宙 更新时间:2023-11-03 23:09:19 31 4
gpt4 key购买 nike

我有一个关于链表中 C# 删除操作的问题。 LinkedListNode<T>是不可变的,但是 Remove(LinkedListNode<T>)是常数时间。为什么我有问题?原因如下:

通常,在删除时我会编写以下代码(忘记空值):

public void Remove(LinkedListNode<T> node) 
{
node.Previous.Next = node.Next;
node.Next.Previous = node.Previous;
}

但是自LinkedListNode<T>是不可变的,这不是一个选项。那如何在O(1)时间内完成呢?

最佳答案

它不是不可变的,但这些属性是 read-only属性:

//Out of LinkListNode<T>:

public LinkedListNode<T> Next {
get { return next == null || next == list.head? null: next;} //No setters
}

public LinkedListNode<T> Previous {
get { return prev == null || this == list.head? null: prev;} //No setters
}

这就是为什么你不能分配它们。不要自己实现它,而是使用 LinkedList<T>.Remove()方法:

LinkedList<int> list = new LinkedList<int>(new int[] { 1, 2, 3, 4 });
list.Remove(3);

// list: 1,2,4

如果您查看 Reference Source你会看到这样的实现:'

public bool Remove(T value) {
LinkedListNode<T> node = Find(value);
if (node != null) {
InternalRemoveNode(node); // <==============
return true;
}
return false;
}

public void Remove(LinkedListNode<T> node) {
ValidateNode(node);
InternalRemoveNode(node); // <==============
}

internal void InternalRemoveNode(LinkedListNode<T> node) {
Debug.Assert( node.list == this, "Deleting the node from another list!");
Debug.Assert( head != null, "This method shouldn't be called on empty list!");
if ( node.next == node) {
Debug.Assert(count == 1 && head == node, "this should only be true for a list with only one node");
head = null;
}
else {
/******************** Relevant part here *****************/
node.next.prev = node.prev;
node.prev.next = node.next;
if ( head == node) {
head = node.next;
}
}
node.Invalidate();
count--;
version++;
}

所以基本上他们也按照您的意愿实现了它,但是他们可以使用不同的变量,这些变量是 internal并且不是 read-only :

internal LinkedListNode<T> next;
internal LinkedListNode<T> prev;

关于c# - c#链表中的删除操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39965441/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com