迭代链表以删除节点

时间:2013-10-16 07:30:56

标签: c#

我知道如何使用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的节点将被删除。

2 个答案:

答案 0 :(得分:3)

提示:在删除之前,这是您列表中的(部分):

+----------------+
| previous Node  |
+----------------+
| some value     |        +----------------+
|     Next ------------>  | currentNode    |
+----------------+        +----------------+
                          | UndesiredValue |       +-----------+
                          |    Next  ------------> | next Node |
                          +----------------+       +-----------+

这是删除后的列表(部分):

+----------------+
| previous Node  |
+----------------+
| some value     |                                 +----------------+
|     Next ------------------------------------->  | next Node      |
+----------------+                                 +----------------+

如您所见,更改上一个节点的Next引用应该足够了。

(因为这显然是家庭作业或训练问题 - 我看不出重新实施linked list in C#的另一个原因 - 这应该足以让你走上正轨。)

提示2:

  • 在遍历列表时,保持对 previous 节点以及当前节点的引用(这是循环体内的一个简单C#赋值)。
  • 找到后,更新上一个节点的Next引用(这也是一个简单的C#分配)。
  • 删除第一个元素需要特别小心,但是在算法的其余部分工作之后,我们会照顾它。

答案 1 :(得分:0)

你应该看一下你可以结束的情况。有两个主要的删除方案

  • 删除第一个元素
  • 删除任何其他元素

您的实施需要同时处理。它直接处理第一个问题。您只需迭代传递具有给定值的前导元素

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;
}

内部循环与前面的简单循环完全相同,您可以稍微压缩代码,但是此代码显示了解决设计问题时应采取的方法。分析您可能已经解决了每个场景的不同场景,然后您可以同时解决几个场景(例如,第三个场景是删除最后一个场景,但是这个场景与上面的第二个场景)