C# 遍历链表以删除节点

C# 遍历链表以删除节点,c#,C#,我知道如何使用while循环遍历单个链表的节点,但是如果某些节点的值与int-value匹配,我如何删除这些节点呢?我有点卡住了,甚至因为这些深入的思考而感到呼吸过度,但我似乎无法完全理解这一点 class Node { public int value ; public Node next ; } 这是while循环,它应该遍历节点,并在找到第一个不需要的值后停止。这个链表可以有多个节点的值是不需要的,所以我不清楚我必须编写哪些额外的代码来实现删除具有不需要的值的节点 while ((cur

我知道如何使用while循环遍历单个链表的节点,但是如果某些节点的值与
int-value
匹配,我如何删除这些节点呢?我有点卡住了,甚至因为这些深入的思考而感到呼吸过度,但我似乎无法完全理解这一点

class Node
{
public int value ;
public Node next ;
}
这是while循环,它应该遍历节点,并在找到第一个不需要的值后停止。这个链表可以有多个节点的值是不需要的,所以我不清楚我必须编写哪些额外的代码来实现删除具有不需要的值的节点

while ((currentNode != null) && (currentNode.Value != UndesiredValue))
   currentNode = currentNode.next;
示例输出:

如果链表有整数

5,7,8,9,3,5,5,2

不需要的值为5,则列表将变为7、8、9、3、2,因为带有5的节点将被删除。

提示:这是删除前列表的一部分:

+----------------+
| previous Node  |
+----------------+
| some value     |        +----------------+
|     Next ------------>  | currentNode    |
+----------------+        +----------------+
                          | UndesiredValue |       +-----------+
                          |    Next  ------------> | next Node |
                          +----------------+       +-----------+
这是您删除后的列表(部分):

+----------------+
| previous Node  |
+----------------+
| some value     |                                 +----------------+
|     Next ------------------------------------->  | next Node      |
+----------------+                                 +----------------+
如您所见,更改上一个节点的
Next
引用就足够了

(因为这显然是一个家庭作业或培训问题——我看不出重新实施a的另一个原因——这应该足以让您走上正确的轨道。)

提示2:

  • 在遍历列表时,保留对前一个节点和当前节点的引用(这是循环体中的一个简单C#赋值)
  • 找到某个节点后,更新上一个节点的
    Next
    引用(这也是一个简单的C#赋值)
  • 删除第一个元素需要特别小心,但是让我们在剩下的算法工作之后再处理它

你应该看看你最终会遇到什么情况。有两种主要的移除场景

  • 移除第一个元素
  • 移除任何其他元素
您的实现需要同时处理这两个问题。处理第一个问题很简单。您只需迭代传递具有给定值的前导元素

var currentNode = head; //head points to the first element of type `Node`
while(currentNode != null && currentNode.Value == undesiredValue) {
     currentNode = currentNode.Next; 
}
head = currentNode;
之后,您需要找到具有不需要的值的元素,并将其从列表中排除

//at this point the head should not be removed
while(currentNode != null && currentNode.Next != null){
   //skip all elements with the undesired value
   var next = currentNode.Next;
   while(next != null && next.Value == undesiredValue){
       next = next.Next;
   }
   currentNode.Next = next;
}

内部循环的作用与前面的简单循环完全相同,您可以对代码进行某种程度的压缩,但是此代码显示了处理设计问题时应采取的方法。分析您可能已经解决了每个场景的不同场景,然后您可能能够同时解决多个场景(例如,第三个场景是删除最后一个元素,但与上述第二个场景一起解决)

我已经知道它是什么样子以及我必须做什么,但我无法在不破坏列表的情况下思考如何用C#编写它……我知道我可能需要创建一个临时节点来帮助我不破坏列表,但这仍然是非常令人沮丧的。我对如何仍然保留链接列表感到困惑,因为currentNode成员仅跟踪前向链链接…@HarrisCalvin:使用第二个变量。调用它
previousNode
并在执行
currentNode=currentNode之前直接执行
previousNode=currentNode
。下一步
。我很困惑,因为在删除了具有不希望的值的节点之后,我们从何处获得没有不希望的值的新链表?
head
变量指向第一个元素结果呢。(它以前不在代码示例中,我只有删除部分,但为了清晰起见,现在包含了它)