删除c#链接列表中的操作

时间:2016-10-10 19:31:34

标签: c# linked-list

我有关于链表中c#remove操作的问题。 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)时间内如何完成?

2 个答案:

答案 0 :(得分:3)

它不是不可变的,但这些属性是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;

答案 1 :(得分:0)

在内部,Remove of LinkedList(T)的方法取决于:

internal void InternalRemoveNode(LinkedListNode<T> node)

反过来,它本身直接操作LinkedListNode(T)的相应后备字段,两者都用internal visibility声明:

internal LinkedListNode<T> prev;

internal LinkedListNode<T> next;

&#39;希望这有帮助,