2015-06-19 5 views
1

Для моей личной практики я пытаюсь создать базовый общий родословный список, и я хочу знать, являются ли методы addtoHead() и addtoTail(), которые я сделал, правильные и эффективные, и если не то, что было бы лучше? и как я могу удалить из списка методы removeDataAt(), removeFromTail(), removeFromHead()?Общий двойной сопоставленный список

класс Node:

public class PracticeNode<T> { 

private T data; 
private PracticeNode<T> next; 
private PracticeNode<T> prev; 

PracticeNode() { 
    next = null; 
    prev = null; 
    data = null; 
} 

PratciceNode(T data) { 

this(data, null, null); 

} 

PracticeNode(T data, PracticeNode<T> next, PracticeNode<T> prev) { 
    this.data = data; 
    this.next = next; 
    this.prev = prev; 
} 

public void setNextNode(PracticeNode<T> next) { 
    this.next = next; 
} 

public void setPrevNode(PracticeNode<T> prev) { 
    this.prev = prev; 
} 

public void setData(T data) { 
    this.data = data; 
} 

public PracticeNode<T> getNextNode() { 
    return next; 
} 
public PracticeNode<T> getPrevNode() { 
    return prev; 
} 

public T getData() { 
    return data; 
} 

} 

Связанный список классов:

public class PracticeLinkedList<T> { 

private PracticeNode<T> head; 
private PracticeNode<T> tail; 

public void addtoHead(T data) { 
    PracticeNode<T> newnode=new PracticeNode<T>(); 
    if(head==null){ 
     head=newnode; 
     tail=newnode; 
     newnode.setNextNode(null); 
     newnode.setPrevNode(null); 
    }else{ 
     newnode.setNextNode(head); 
     head.setPrevNode(newnode); 
     head=newnode; 
    } 

} 

public void addToTail(T data) { 
    PracticeNode<T> newnode=new PracticeNode<T>(); 
    if(tail==null){ 
      head=newnode; 
      tail=newnode; 
      newnode.setNextNode(null); 
      newnode.setPrevNode(null); 
     }else{ 
      newnode.setPrevNode(tail); 
      tail.setNextNode(newnode); 
      tail=newnode; 
     } 


} 

public T removingDataAt (int){ 
    //.... 
} 

public T removingFromTail(){ 
    //.... 
} 

public T removingFromHead(){ 
    //.... 
} 
} 
+0

вам не нужен хвостовой узел. – BevynQ

+0

'addToTail()' и 'addToHead()' выглядят правильно. Вы можете сделать их более эффективными, отметив, что вы инициализируете 'head' и' prev' в конструкторе, поэтому нет необходимости устанавливать их в «null» в этих методах. – dave

ответ

2

addToTail выглядит хорошо для меня.

С removingDataAt(), removingFromTail() и removingFromHead(), вы хотите сделать то, что вы сделали с помощью addToTail и addToHead. Поскольку это похоже на что-то из задания, я не буду давать код, но просто скажу вам, как это сделать.
Я вижу, что у вас есть только навигационные экземпляры головы и хвоста, я бы рекомендовал вам также реализовать «текущий», который позволит вам перемещаться по списку, чтобы делать такие вещи, как removingDataAt(location). Я не уверен в самом эффективном методе удаления вещей, но с Java он автоматически собирает мусор, поэтому вы можете просто удалить его с головы, используя head = head.getNextNode(). Удаление из хвоста - подобная история.
Для removingDataAt() вам понадобится метод поиска данных сначала, если только использование уже не знает, что находится в каждом месте списка. Возможно, что-то вроде find(object), которое вернет сообщение об ошибке при сбое и в противном случае переместит «текущий» экземпляр на найденный объект. Вы бы это сделали, используя следующее:
for(current = head; current!=null; current = current.getNextNode())

Не забывайте проверять, есть ли другие предметы в связанном списке.

+0

Нет, это личная практика для моей сертификации Java, поэтому любой код и помощь приветствуются. –

1

Вот твердая реализация дважды связанный список: http://algs4.cs.princeton.edu/13stacks/DoublyLinkedList.java.html

метод Add выглядит следующим образом:

// add element to list 
    public void add(Item item) { 
     Node x = current.prev; 
     Node y = new Node(); 
     Node z = current; 
     y.item = item; 
     x.next = y; 
     y.next = z; 
     z.prev = y; 
     y.prev = x; 
     N++; 
     index++; 
     lastAccessed = null; 
    } 

Что здесь отметить:

a> <b> <c> <e> <f> <g 

если вы хотите добавить d, а затем найдите e и добавьте d

public void add(Item item) { 
     Node x = current.prev; //new before element : c 
     Node y = new Node(); //new node to store element 
     Node z = current;  //new after element : e 
     y.item = item;   //store value to the node : d.value=value 
     x.next = y;   //link before element next : c> 
     y.next = z;   //link element next : d> 
     z.prev = y;   //link after element previous : <e 
     y.prev = x;   //link after element previous : <d 
     N++;     //increase number of elements on list counter 
     index++;    //increase current position number 
     lastAccessed = null; 
    } 

теперь вы должны иметь:

a> <b> <c> <d> <e> <f> <g 
+0

Целая причина, по которой использовать связанные списки, заключается в том, что вставка элементов между элементами намного быстрее, чем на массивы. Вы используете x2 общие списки, которые за кулисами используют массивы, поэтому то, что вы написали, не имеет значения. Будучи учителем, я не принимал бы это как решение. – Margus

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