Подскажите пожалуйста в чём ошибка. Пытаюсь использовать рекурсивный метод на самодельном односвязном списке, но появляется ошибка System.NullReferenceException: Ссылка на объект не указывает на экземпляр объекта.
class Node
{
public Node() { }
public Node(Node PreviousNode)
{
next = PreviousNode.Next;
Element = PreviousNode.Element;
}
public void SetNextNode(Node _nextNode)
{
next = _nextNode;
}
public int Element
{
get
{
return element;
}
set
{
element = value;
}
}
public Node Next
{
get
{
return next;
}
}
private Node next;
private int element;
}
class List
{
public List()
{
// создание пустого списка
headNode = null;
tailNode = headNode;
Length = 0;
}
public void Push(int _element)
{
if (headNode == null)
{
// создать узел, сделать его головным
headNode = new Node();
headNode.Element = _element;
// этот же узел и является хвостовым
tailNode = headNode;
// следующего узла нет
headNode.SetNextNode(null);
}
else
{
// создать временный узел
Node newNode = new Node();
// следующий за предыдущим хвостовым узлом - это наш временный новый узел
tailNode.SetNextNode(newNode);
// сделать его же новым хвостовым
tailNode = newNode;
tailNode.Element = _element;
// следующего узла пока нет
tailNode.SetNextNode(null);
}
++Length;
}
public int this[int _position]
{
get
{
Node tempNode = headNode;
for (int i = 1; i <= _position; ++i)
// переходим к следующему узлу списка
tempNode = tempNode.Next;
return tempNode.Element;
}
}
public int Length { get; private set; }
private Node headNode;
private Node tailNode;
}
Вот данный код и не работает:
public void Insert(int element, int place)
{
if (place == 0)
{
PushFirst(element);
}
else if (place == 1)
{
Node newNode = new Node();
newNode.Element = element;
newNode.SetNextNode(headNode.Next);
headNode.SetNextNode(newNode);
++Length;
}
else if(place == 2)
{
Node newNode = new Node();
newNode.Element = element;
newNode.SetNextNode(headNode.Next.Next);
headNode.Next.SetNextNode(newNode);
++Length;
}
else
{
Node tempNode = headNode.Next.Next;
Node preNode = headNode.Next;
headNode.SetNextNode(preNode);
preNode.SetNextNode(tempNode);
RecursionInsert(tempNode, preNode, element, place);
}
}
private void RecursionInsert(Node tempNode,Node prenode, int element, int place)
{
if (place == 0)
{
Node newNode = new Node();
newNode.Element = element;
newNode.SetNextNode(tempNode);
prenode.SetNextNode(newNode);
}
else
{
prenode.SetNextNode(tempNode);
tempNode = tempNode.Next;
RecursionInsert(tempNode,prenode, element, place--);
}
}
Но при этом вот данный метод прекрасно работает:
public void Remove(int element)
{
Node preNode = new Node();
Node tempNode = headNode;
while ( true )
{
if(tempNode.Element == element)
{
preNode.SetNextNode(tempNode.Next);
break;
}
preNode = tempNode;
tempNode = tempNode.Next;
}
Length--;
}
Вот как, должно быть...
private void RecursionInsert(Node temp, Node prenode, int element, int place)
{
if (place != 0)
{
prenode = temp;
temp = temp.Next;
prenode.SetNextNode(temp);
place--;
RecursionInsert(temp,prenode, element, place);
}
else
{
Node newNode = new Node();
newNode.Element = element;
newNode.SetNextNode(temp);
prenode.SetNextNode(newNode);
}
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Взял код с официального сайта и он не работает (убрал немного лишнего);
При регистрации в базу данных сохраняется пустая строка когда выполняю $user->save()Причём валидацию проходит нормально
В Url manager написал простое правило для URL товаров с категориями