Связанный список строк

Я пытаюсь сделать класс StringBuilder как класс, используя связанные списки, и я думаю, что я запутался где-то в своем конструкторе. Может ли кто-нибудь найти здесь проблему? Я считаю, что проблема связана с тем, как я перехожу к следующему узлу.

Класс узла:

private class CNode
{
 private char data;
 private CNode next;

 private CNode(char c)
 {
 data = c;
 next = null;
 }

 private CNode(char c, CNode nextNode)
 {
 data = c;
 next = nextNode;
 }
}

Конструктор:

private CNode firstNode;
private int length;

public MyString(String s)
{
 if(s == null)
 {
 this.length = 0;
 this.firstNode = null;
 }
 else if(s.length() == 1)
 {
 this.length = 1;
 this.firstNode.data = s.charAt(0);
 this.firstNode.next = null;
 }
 else
 {
 this.length = s.length();
 CNode node = null;
 CNode nextNode = null;

 this.firstNode = new CNode(s.charAt(0), node);

 for(int i = 1; i < s.length(); i++)
 {
 node = new CNode(s.charAt(i), nextNode);
 node = node.next;
 }
 }
}
2 ответа

Одна из проблем, которую я вижу, - это

this.firstNode = new CNode(s.charAt(0), node);

Когда эта строка выполняется, node имеет значение null, поэтому ваш firstNode связан ни с чем. Кроме того, в цикле for, где вы пытаетесь создать ссылки, вы никогда не назначаете nextNode, но пытаетесь использовать его для привязки одного узла к другому. Следовательно, все узлы заканчиваются ссылкой на null, начальное значение nextNode.

Другой вопрос:

this.firstNode.data = s.charAt(0);
this.firstNode.next = null;

Это должно быть создание нового CNode, потому что this.firstNode по-прежнему является нулевым, когда этот код выполняется, что вызовет исключение NullPointerException.


Здесь могут быть и другие проблемы, но рассмотрим этот блок кода:

else if(s.length() == 1)
{
 this.length = 1;
 this.firstNode.data = s.charAt(0);
 this.firstNode.next = null;
}

Обратите внимание, что вы никогда не выделяли this.firstNode, что означает, что вы будете получать NullPointerException при выполнении второй строки кода. Попробуйте выделить узел перед его записью.

Надеюсь это поможет!

licensed under cc by-sa 3.0 with attribution.