2013-05-17 3 views
3

Я пытаюсь написать метод для добавления в конце одного связанного списка в постоянное время. Я не знаю, как назначить указатель на последний узел в списке в постоянное время. Этот метод работает в 0 (п):добавление в конце односвязного списка в постоянное время

public void insertEnd(Object obj) { 
if (head == null) { 
    head = new SListNode(obj); 
} else { 
    SListNode node = head; 
    while (node.next != null) { 
    node = node.next; 
    } 
    node.next = new SListNode(obj); 
} 
size++; 
} 

Это начало моего нового метода:

public void addLast(SListNode obj){ 
    //if the list is empty, the new element is head and tail 
    if(tail == null){ 
     obj.next = null; 
     head = tail = obj; 
    }else{ -----> here I'm confused 

    } 
} 

Это мой SLIST класс:

public class SList { 
    private SListNode head; 
    private SListNode tail; 
    private int size; 

    public SList() { 
    size = 0; 
    head = null; 
    tail = null; 

} 
+3

Может хранить конец списка, как поле в классе? –

+0

Я сделал это, но как вы на самом деле назначили его последнему элементу? – Dodi

+0

@Frugo, 'tail.next = obj;' – BLuFeNiX

ответ

3

Я думаю, это должно покрыть его: (должны идти в else)

tail.next = obj; // have (the current tail).next point to the new node 
tail = obj; // assign 'tail' to point to the new node 
obj.next = null; // may not be required 
1

Вы должны реализовать Double Ended Queue, которые позволяют вставлять на голову или в хвост вашего списка

Если ваш список пуст, голова и хвост равны нулю, если он содержит один элемент head == tail

public void addLast(SListNode obj){ 
//if the list is empty, the new element is head and tail 
if(tail == null){ 
    obj.next = null; 
    head = tail = obj; 
}else{ -----> here I'm confused 
    tail.next = obj; 
    tail = obj; 
}