[英]NullReferenceException when trying to add to a list of dictionaries
[英]NullReferenceException when trying to add item to end of singly linked list
我正在嘗試將一個節點添加到單向鏈表的末尾。 但我不斷收到 NullReferenceException。 我已經嘗試了一切,但我無法讓它工作。 代碼背后的想法是不斷循環列表直到我們到達 null(標記鏈表的末尾),然后我們在末尾添加一個新節點。 所以問題是為什么我會得到這個,我怎樣才能讓它工作?
您將在下面找到代碼。
using System;
using System.Diagnostics;
using System.Threading;
namespace LinkedList
{
public class Node<T> where T : IComparable
{
public T Value;
public Node<T> Next { get; set; }
public Node(T value, Node<T> next)
{
this.Value = value;
this.Next = next;
}
}
public class SortedLinkedList<T> where T : IComparable
{
public Node<T> start;
public SortedLinkedList()
{
start = null;
}
public SortedLinkedList(Node<T> node)
{
start = node;
}
public void Insert(T value)
{
if ( this.start == null )
{
this.start = new Node<T>(value, this.start);
}
Node<T> curr = this.start;
while ( curr != null )
{ curr = curr.Next;}
curr.Next = new Node<T>(value,curr.Next);
}
}
public class Program
{
public static void Main(string[] args)
{
var list =
new SortedLinkedList<int>(
new Node<int>(
5, new Node<int>(
7, new Node<int>(
21, new Node<int>(
30, null)
)
)
)
);
list.Insert(12);
var list2 = new SortedLinkedList<string>();
list2.Insert("hello");
}
}
}
您必須重寫while
循環並檢查curr.Next
屬性是否為null
值,否則在循環完成后您將獲得null
作為curr
值。
Node<T> curr = start;
while (curr.Next != null)
{
curr = curr.Next;
}
curr.Next = new Node<T>(value, curr.Next);
此外,您在列表末尾插入節點,而不與現有節點進行比較。 這意味着,盡管有SortedLinkedList
類名,但您的列表並未排序。
要對列表進行排序,您應該在while
循環中逐個比較值以找到值的正確位置,或者如果找不到位置,則將其插入到末尾。 類似的東西
var comparer = Comparer<T>.Default;
Node<T> curr = start;
var inserted = false;
while (curr.Next != null)
{
if (comparer.Compare(curr.Value, value) < 0 &&
comparer.Compare(curr.Next.Value, value) >= 0)
{
var previous = curr.Next;
curr.Next = new Node<T>(value, previous);
inserted = true;
break;
}
curr = curr.Next;
}
if (!inserted)
curr.Next = new Node<T>(value, curr.Next);
看這段代碼:
while ( curr != null )
{ curr = curr.Next;}
當curr
為null
,這里循環結束,因此下一行您將在curr.Next
上獲得 null 引用。 嘗試以下操作:
while (curr.Next != null)
{
curr = curr.Next;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.