Ошибка system.nullreferenceexception

330
21 марта 2017, 10:27

Подскажите пожалуйста в чём ошибка. Пытаюсь использовать рекурсивный метод на самодельном односвязном списке, но появляется ошибка 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--;
        }
Answer 1

Вот как, должно быть...

 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);
            }
READ ALSO
Не выводится изображение

Не выводится изображение

Взял код с официального сайта и он не работает (убрал немного лишнего);

290
Сохраняет пустые данные с помощью model-&gt;save() в Yii2

Сохраняет пустые данные с помощью model->save() в Yii2

При регистрации в базу данных сохраняется пустая строка когда выполняю $user->save()Причём валидацию проходит нормально

703
Получить имена методов

Получить имена методов

Вывод из var_dump()

262
Замена символов в URL на Yii2

Замена символов в URL на Yii2

В Url manager написал простое правило для URL товаров с категориями

414