2016-07-03 3 views
2

Я начинаю изучать Java. В качестве привязки я должен реализовать двусвязный список с данными интерфейсами, которые я включил в код. Мой метод insertAtTheEnd() кажется не работает должным образом, так как у меня есть значение null на элементах после вставки нескольких. Я проверил похожие вопросы по этой теме и попытался применить ответы на мою проблему, но не смог получить дальнейших результатов. Поэтому любая помощь оценивается, как я могу настроить этот метод, чтобы он работал. Спасибо!Как добавить узел в двусвязный список в Java?

public interface IValueElement 
{ 
    public String getName(); 
    public void setName(String paramName); 
    public int getValue(); 
    public void setValue(int paramValue); 
} 

public interface IListElement 
{ 
    public IValueElement getValueElement(); 
    public void setValueElement(IValueElement value); 
    public IListElement getPredecessor(); 
    public void setPredecessor(IListElement predecessor); 
    public IListElement getSuccessor(); 
    public void setSuccessor(IListElement successor); 
} 

public interface IList 
{ 
    public IListElement getHead(); 
    public void insertAtTheEnd(IValueElement value); 
//... 
} 

public class List implements IList 
{ 
    public List() 
    { 
     if (head == null) 
     { 
      head = new ListElement(null); 
     } 
     else 
     { 
      return; 
     } 
    } 

    private IListElement head; 

    public IListElement getHead() 
    { 
     return head; 
    } 

    public void insertAtTheEnd(IValueElement value) 
    { 
     if (head.getSuccessor() != null) 
     { 
      IListElement l = head; 
      while (l.getSuccessor() != null) 
       l = l.getSuccessor(); 
      IListElement q = new ListElement(value); 
      l.setPredecessor(q); 
     } 
     else 
     { 
      IListElement q = new ListElement(value); 
      q.setPredecessor(head); 
      q.setSuccessor(null); 
      head.setSuccessor(q); 
      head.setPredecessor(q); 
     } 
    } 
} 

Кроме того здесь мои реализации ValueElement и ListElement:

//ListElement.java 

public class ListElement implements IListElement 
{ 
    public ListElement(IValueElement value) 
    { 
     this.valueElement = checkValueElementAttribute(value); 
    } 

    private IValueElement checkValueElementAttribute(IValueElement value) 
    { 
     return (value == null) ? new ValueElement(null, 0) : value; 
    } 

    private IValueElement valueElement; 

    public IValueElement getValueElement() 
    { 
     return this.valueElement; 
    } 

    public void setValueElement(IValueElement value) 
    { 
     if (value != null) 
     { 
      this.valueElement = value; 
     } 
    } 

    private IListElement predecessor; 

    public IListElement getPredecessor() 
    { 
     return this.predecessor; 
    } 

    public void setPredecessor(IListElement predecessor) 
    { 
     this.predecessor = predecessor; 
    } 

    private IListElement successor; 

    public IListElement getSuccessor() 
    { 
     return this.successor; 
    } 

    public void setSuccessor(IListElement successor) 
    { 
     this.successor = successor; 
    } 
} 


// ValueElement.java 
public class ValueElement implements IValueElement 
{ 
    private String name; 

    public String getName() 
    { 
     return this.name; 
    } 

    public void setName(String paramName) 
    { 
     if (paramName != null) 
     { 
      this.name = paramName; 
     } 
    } 

    public ValueElement(String name, int value) 
    { 
     if (name == null || name.equals("")) 
     { 
      name = "default"; 
     } 
     else 
     { 
      this.name = name; 
     } 
     this.value = value; 
    } 

    private int value; 

    public int getValue() 
    { 
     return this.value; 
    } 

    public void setValue(int paramValue) 
    { 
     if (paramValue != 0) 
     { 
      this.value = paramValue; 
     } 
    } 

    public String toString() 
    { 
     return "Name: " + this.name + " - Value: " + this.value; 
    } 

} 
+0

Почему конструктор содержит эти строки, они совершенно ненужным, так как новый Устроенный объект всегда имеет 'head' как null. Вы можете полностью удалить конструктор и инициализировать 'head', где вы его объявляете. – Kayaman

+0

Посмотрите на блок 'if'. В отличие от блока else, он не устанавливает преемника чего-либо. Так что чего-то не хватает. Кроме того, q, является новым конечным узлом, поэтому он должен быть преемником 'l', а не его предшественником. Хорошее переименование имен поможет вам. –

+0

@ Кайаман: Вы правы, спасибо за намек. Голова не должна быть нулевой, это ошибка. – mark

ответ

0

пожалуйста, предоставьте полный код, так что мы можем работать, что и поможет вам, как сейчас мы можем думать только из этих проблем:

1) Вы не могли бы назвали setValueElement на этих узлах 2) ваш еще блок содержит установку как предшественника и преемника того же элемента, так что его определенная неправильная строка кода

не должно это быть ваш код

public void insertAtTheEnd(IValueElement value) 
    { 
     if (head.getSuccessor() != null) 
     { 
      IListElement l = head; 
      while (l.getSuccessor() != null) 
       l = l.getSuccessor(); 
      IListElement q = new ListElement(value); 
      l.setSuccessor(q); 
     }  

    else 
     { 
      IListElement q = new ListElement(value); 
      q.setPredecessor(head); 
      q.setSuccessor(null); 
      head.setSuccessor(q); 
     } 
    } 
+0

это должен быть комментарий – AADProgramming

+0

Спасибо, я проверю эту строку. Я просто включил запрошенный код (см. Предыдущий ответ). – mark

+0

@AADTechnical моя репутация не позволяет мне комментировать –

0

ли реализации IValueElement и IListElement были предоставлены для вас, или они что-то, что вы должны реализовать? Из кода, который вы предоставили, я не вижу реализации для них.

Что касается вашего метода insertAtTheEnd, похоже, что у вас есть в основном правильная идея, но, возможно, вы можете улучшить ее.

В конце блока if вы устанавливаете l-s-предшественник на q. Я думаю, что это может быть неверно. l в этом пункте является последним элементом в списке, пройдя по цепочке преемников, пока не будет больше, мне кажется, что новый элемент (q) теперь должен быть добавлен как преемник l НЕ предшественника. Кроме того, я думаю, что для этого нужно, чтобы его предшественник был установлен на l.

В вашем блоке else вы правильно установили предшественника и преемника q и правильно установили преемника главы, однако, почему вы устанавливаете предшественника главы на q? Это сделало бы и преемником, и предшественником. Я думаю, вам нужно просто удалить этот последний вызов setPredecessor.

+0

Спасибо за ваш ответ, я проверю это и попытаюсь его улучшить. Поскольку я новичок в Java, это, вероятно, займет у меня некоторое время. Я просто включил свои реализации IValueElement и IListElement. – mark

Смежные вопросы