【问题标题】:How to search an element in a Linked List? (c#)如何在链表中搜索元素? (C#)
【发布时间】:2020-07-10 19:44:47
【问题描述】:

我得到了这组代码,我需要在 while 循环上方和 While 循环中用一些代码填充它。我看过一些文档,但我所看到的只是带有两个参数的搜索方法,而这个只有一个。我已经在while循环中写了这部分,但我注意到这是否正确。如何完成此代码以搜索作为参数给出的值?

注意:这不是我要求你为我做的家庭作业,而是我们拥有的为数不多的学习资源之一,如果你能完成它,它会让我更好地掌握。

当我现在运行此代码时,我收到以下错误消息: “Tests.Node”类型不包含“value”的定义,并且找不到“Tests.Node”类型的扩展方法“value”。您是否缺少程序集参考?

{
  public class Node<T> where T : IComparable
{
public T Value { get; }
public Node<T> Next { get; set; }

public Node(T value, Node<T> next)
{
  this.Value = value;
  this.Next = next;
}
}

 public class LinkedList<T> where T : IComparable
  {
public Node<T> start;

public LinkedList()
{
  start = null;
}

public LinkedList(Node<T> node)
{
  start = node;
}

public Node<T> Search(T value)
{
  [here is code needed]
  while (start != null)
    if(start.value.CompareTo(value) == 0){
      return start;
    }
    start = start.next;
}
 }
   public class Program {
    public static void Main(string[] args){
  var list =
    new LinkedList<int>(
      new Node<int>(
        5, new Node<int>(
          7, new Node<int>(
            21, new Node<int>(
              30, null)
            )
          )
        )
    );
  var a = 21;
  var fr = list.Search(a);
}
 }
}

【问题讨论】:

  • 假设您不想改变您的列表以从搜索找到匹配项的位置开始,您确实应该将 start 分配给局部变量并改用它。另外你需要处理没有匹配的情况,也许最后是return null;
  • 将 start 分配给本地变量是什么意思?
  • 我的意思是 var curr = start; 然后 while(curr != null)curr = curr.Next; 等等。否则下次搜索 start 时将被设置为具有匹配值的节点,您将不会搜索整个列表。

标签: c# list generics search


【解决方案1】:

您非常接近正确的解决方案。首先,您需要修复编译器错误 - 将 valuenext 更改为 ValueNext,因为您的 Node 类上的 properties 是如何被调用的。

接下来您需要添加大括号,以便while 块将执行赋值start = start.Next;(目前只有if statement 在while 中,因此您将以无限循环结束)

接下来你需要修复 return - 在 while 块之后添加 return null; - 如果没有找到,你将返回值(也没有它,代码将无法编译)。

最后,您需要解决在搜索期间更改列表的问题(您正在使用 LinkedList 修改 LinkedList 类的 start = start.Next 字段,您不应该这样做),引入一个临时变量(i'将其命名为 curr),将其赋值为 start 并在您的 while 循环中使用它:

public Node<T> Search(T value)
{
    var curr = start;
    while (curr != null)
    {
        if (curr.Value.CompareTo(value) == 0)
        {
            return curr;
        }
        curr = curr.Next;
    }
    
    return null;
} 

【讨论】:

  • 谢谢,您的代码几乎是正确的,我只将var 调整为Node&lt;T&gt; 以使其正常工作
  • @user3660293 很乐意提供帮助!
【解决方案2】:

我建议实现IEnumerable&lt;Node&lt;T&gt;&gt;接口

public class Node<T> : IEnumerable<Node<T>> where T : IComparable {
  public IEnumerator<Node<T>> GetEnumerator() {
    for (Node<T> item = this; item != null; item = item.Next)
      yield return item;        
  }

  IEnumerator IEnumerable.GetEnumerator() => GetEnumerator();

  ...

那么就可以使用Linq来查询集合了:

  using System.Linq;

  ...

  public static void Main(string[] args) {
    LinkedList<int> list = ... 

    int a = 21;

    var fr = list.start.FirstOrDefault(item => item.Value == a);     

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-02-19
    • 1970-01-01
    • 1970-01-01
    • 2013-07-20
    • 2011-06-03
    • 1970-01-01
    • 2018-12-10
    • 1970-01-01
    相关资源
    最近更新 更多