Глобально объявленная переменная, возвращающая значение NULL после вызова метода - PullRequest
1 голос
/ 09 июля 2020

Я пытаюсь создать LinkedList в C#. Я новичок в этом. Не могли бы вы помочь мне здесь? Я пытаюсь сделать следующее: я создал переменные типа узла и lastNode и пытаюсь добавить узел к каждому предыдущему узлу, проверяя последний узел с помощью метода GetLastNode(). Хотя каждый раз, когда я пытаюсь добавить второй элемент, при достижении GetLastNode() голова становится нулевой. Я не уверен, почему это происходит. Пожалуйста, помогите мне понять концепцию, которую я упускаю.

class MyLinkedList
    {
        Node head, lastNode; 
        
        public void Add(int new_value)
        {
            Node new_node = new Node(new_value);                
            MyLinkedList obj = new MyLinkedList();
            lastNode = obj.GetLastNode();
            if(lastNode == null)
            {
                lastNode = new_node;
                this.head = new_node;
            }                  
            
            else
            {
                lastNode.next = new_node;
            }
        }
        public Node GetLastNode()
        {
            Node currentNode = this.head;
            if (currentNode == null)
                lastNode = currentNode;
            else
                while (currentNode != null)
                {
                    lastNode = currentNode;
                    currentNode = currentNode.next;
                }
            
            return lastNode;

        }
    }

1 Ответ

1 голос
/ 09 июля 2020

head и lastNode не являются глобальными, это поля , которые будут отличаться для каждого экземпляра MyLinkedList. В Add ваш a создает новый (с ключевым словом new) экземпляр MyLinkedList, который возвращает null для GetLastNode() и назначает этот null текущему lastNode, поэтому вы получите null для вашего текущего lastNode до if:

MyLinkedList obj = new MyLinkedList();
lastNode = obj.GetLastNode();

Я бы сказал, вы можете просто удалить эти строки.

Также кажется, что GetLastNode должен просто вернуть lastNode потому что вы уже выполняете все необходимое отслеживание на Add:

public Node GetLastNode()
{
    return lastNode;
}
...