2015-10-03 2 views
0

Я понимаю, что есть несколько хороших нитей уже существующих, которые обсуждают, как реализовать связанный список в Java, но я не могу показаться, чтобы найти тот, который не использует конструктор, как это,Как вручную реализовать Связанный список в Java без использования конструктора?

public LinkList() { 
    Link = null; 
} 

или что-то в этом роде. Тем не менее, я не сделал этого в своем коде, и поэтому у меня возникли проблемы с написанием нескольких методов.

У меня есть класс, называемый Link, который содержит следующий код, заметки без конструктора, как один отображается выше:

public class Link { 
private Link next = null; 
private String value = null; 

public Link getNext(){ 
    return next; 
} 

public void setNext(Link nextLink){ 
    next = nextLink; 
} 

public String getValue(){ 
    return value; 
} 

public void setValue(String aValue){ 
    value = aValue; 
} 
} 

, а затем у меня LinkedList класс, который содержит следующий код:

public class LinkedList { 
private Link head = null; 
private Link tail = null; 

public Link getHead(){ 
    return head; 
} 

public void setHead(Link aLink){ 
    head = aLink; 
} 

public Link getTail(){ 
    return tail; 
} 

public void setTail(Link aLink){ 
    tail = aLink; 
} 

public boolean isEmpty(){ 
    return(head == null && tail == null); 
} 

public void addLast(String aString){ 
    Link link = new Link(); 
    link.setValue(aString); 
    //tail.setNext(link); 
    if(isEmpty()){ 
     head = link; 
    }else{ 
     tail.setNext(link); 
    } 
    tail = link; 

    } 

public void addFirst(String aString) { 
    Link link = new Link(); 
    link.setValue(aString); 

    if(isEmpty()){ 
     tail = link; 
    }else{ 
     head.setNext(link); 
    } 
    head = link;   
} 

public Link removeFirst(){ 
    Link temp = head; 
    head = temp.getNext(); 
    temp.setNext(null); 

    return temp; 
} 

}

Мой addFirst метод, и мой isEmpty метод как, кажется, работает, но мои addLast и removeFirst Методы - нет. Я нарисовал картинки, посмотрел на псевдокод и искал по интернету, но я просто не могу понять это.

Мне нужно знать, как получить мои методыи removeFirst, работая без необходимости добавлять в конструктор в начале, как и все остальные примеры кода, которые я продолжаю видеть.

Вот тесты, они должны пройти:

@Test 
public void testRemoveFirst(){ 
    list.addFirst("three"); 
    list.addFirst("two"); 
    list.addFirst("one"); 
    assertTrue("one".equals(list.removeFirst())); 
    assertTrue("two".equals(list.removeFirst())); 
    assertTrue("three".equals(list.removeFirst())); 
} 

@Test 
public void testAddLast(){ 
    list.addFirst("three"); 
    list.addFirst("two"); 
    list.addFirst("one"); 
    assertTrue("three".equals(list.removeLast())); 
    assertTrue("two".equals(list.removeLast())); 
    assertTrue("one".equals(list.removeLast())); 
    assertNull(list.removeLast()); 
} 
+7

Почему вы не хотите конструктора? – user2357112

+0

Можете ли вы предоставить тестовый пример, где эти методы не работают? –

+4

(И почему вы думаете, что конструктор имеет какое-либо отношение к вашей проблеме?) – user2357112

ответ

2

Одно изменение в коде необходимо: вы хотите новую ссылку, чтобы указать на старую голову, как «следующий» (не наоборот) потому что вы хотите вставить его в начале.

public void addFirst(String aString) { 
     Link link = new Link(); 
     link.setValue(aString); 

     if (isEmpty()) { 
      tail = link; 
     } else { 
      link.setNext(head); 
     } 
     head = link; 
    } 

Кроме того, вы должны изменить ваши тесты, как теперь сравнивать строки в Свяжите экземпляров вместо строки в строку

assertTrue("one".equals(list.removeFirst().getValue())); 
    assertTrue("two".equals(list.removeFirst().getValue())); 
    assertTrue("three".equals(list.removeFirst().getValue())); 

После этих изменений тест проходит для меня (первый, вы Бесполезный 't реализовать метод removeLast для второго).

+0

О, ладно. Эта первая часть имеет смысл, и я сменил тест, как вы сказали, и зеленый свет. Тем не менее, мне интересно, как увядать или нет, есть ли способ сделать его зеленым светом так, как он был написан? Мой профессор был тем, кто написал тест, но я думал, что он сказал что-то вроде того, что он написал один из них неправильно. Однако я не уверен. – GL007

+1

Вы можете передать их, если ваш 'list.removeFirst()' метод вернет 'String' вместо' Link'. Вероятно, вы должны реализовать его таким образом, так как пользователи вашей реализации «List» не должны знать о деталях реализации. Класс «Link» является детальностью реализации и должен использоваться только внутри страны и не быть видимым снаружи (что может быть даже реализовано путем создания его внутреннего статического класса List или сделать его закрытым в том же пакете, что и класс List). Кроме того, вы берете экземпляр «String» от пользователя в методе 'add', было бы согласным возвращать' String' в 'removeFirst'. –

+0

Я смущен тем, как я это написал. Измените его на тип String и верните строку, но как? Мой мозг чувствует себя таким жареным из тех часов, которые я потратил на это. – GL007

0

Вам не нужен конструктор для назначения null, 0 и false полям объектов. Поля получают эти значения автоматически. Просто удалите конструктор, который выполняет только такие назначения, и это не будет никакой разницей в исполнении.

Вы также можете назначить другие значения по умолчанию, такие как int a = 17, непосредственно в декларации, и вы можете также включать выражения, такие как int b = a + 1, при условии, что поле a было объявлено ранее. Но вы не можете передавать параметры, которые должны иметь разные значения для разных экземпляров. Для этого и нужен конструктор.

У вас могут быть оставлены другие ошибки, но это не будет конструктором.

Чаще всего разработчики просто используют готовое решение, LinkedList.

+0

Мне это известно. Кажется, я немного смутился от того, что я пытался спросить. Я просто не знаю, где это сделать/как писать и передавать эти два метода. – GL007

+0

Почему вы спрашиваете, откуда вы знаете? – h22

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