为什么 LinkedListNode Next 属性是只读的?

spr*_*ing 3 c#

我一直在使用 C# 处理 LeetCode 问题,并且在尝试将 linkedlistnode 的下一个值设置为新节点时注意到一个问题,即“属性或索引器......Next 无法分配给 - 它是只读'。我可以从节点的下一个读取,但无法将节点分配给节点的下一个。为什么 .NET 会出现这种情况?

var l1Value = l1 == null ? 0 : l1.Value;
var l2Value = l2 == null ? 0 : l2.Value;
var newNode = new LinkedListNode<int>((l1Value + l2Value + overflow) % 10);
start.Next = newNode; <------ red squiggly
start = start.Next; <------ no red squiggly
Run Code Online (Sandbox Code Playgroud)

Mar*_*zek 5

您应该使用AddBefore//AddAfter方法将元素添加到列表中。AddFirstAddLastLinkedList

我不知道 100%,但我假设 API 表面不允许您修改Nexta 的元素LinkedListNode,因为这会让您最终遇到奇怪的事情,例如循环、不完整的列表等。主要是造成不一致状态的事情。该文档LinkedList说不支持:

该类LinkedList<T>不支持链接、拆分、循环或其他可能使列表处于不一致状态的功能。该列表在单个线程上保持一致。唯一支持的多线程场景LinkedList<T>是多线程读取操作。

作者决定最好提供方法来完成常见的插入/删除操作并确保所有正确的事情发生,而不是使用设置器公开低级别Next/属性。Previous例如,他们确保两者NextPrevious在每次插入/删除时得到更新。如果他们允许您修改NextPrevious直接修改,则无法确保两者在必要时始终更新。您仍然可以完成您需要的任务,但是当人们自己实现这些操作时,它们限制了出现错误的可能性。

  • 不完全是。您应该执行`var list = new LinkedList&lt;int&gt;`,稍后当您想要添加节点时,您可以执行`list.AddFirst(5)`。您应该保留并使用“列表”本身,而不是保留作为列表头部的节点。 (4认同)