C# - LinkedList - 如何删除指定节点后的所有节点?

roc*_*eye 3 c# linked-list

我正在实现一个带有通用LinkedList的undo/redo缓冲区.

在这种状态下:
[Top]
state4(撤消)
state3(撤消)
state2 < - 当前状态
state1
[bottom]

当我执行Push时,我想删除当前状态之后的所有状态,并推送新状态.

我目前的旁路是做,while (currentState != list.last), list.removeLast();但它很糟糕

LinkedList只支持Remove,RemoveFirst和removeLast ...

我想要像RemoveAllNodesAfter(LinkedListNode ...)这样的东西?

如何在不迭代所有节点的情况下很好地编码?也许有扩展?...

Jon*_*eet 6

我在标准中看不到任何LinkedList<T>可以让你这样做的东西.如果需要,您可以查看PowerCollectionsC5集合 - 或者只是滚动您自己的LinkedList类型.它是要实现的更简单的集合之一,特别是如果您可以"及时"方式添加功能.


ang*_*son 6

如果我自己实现这个,我会选择一种不同的方式来实现它.

而不是.RemoveAllNodesAfter(node)方法,我会选择创建一个.SplitAfter(node)方法,返回一个新的链表,从下一个节点开始node.这将成为一种更方便的工具,而不仅仅是能够切断尾部.如果你想要你的RemoveAllNodesAfter方法,它只需要在SplitAfter内部调用方法并丢弃结果.

天真的实施:

public LinkedList<T> SplitAfter(Node node)
{
    Node nextNode = node.Next;

    // break the chain
    node.Next = null;
    nextNode.Previous = null;

    return new LinkedList<T>(nextNode);
}

public void RemoveAllNodesAfter(Node node)
{
    SplitAfter(node);
}
Run Code Online (Sandbox Code Playgroud)