Создание собственного метода удаления в двусвязном списке - PullRequest
0 голосов
/ 21 октября 2011

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

  1. , если список пуст
  2. , если удаляемый узел является головой
  3. , если узел является хвостом
  4. , если узелгде-то в середине списка

Это код, который у меня есть до сих пор.

public void delete(Node n) {
    if (head == null) {
        System.out.println("the list is empty");
    } else if (head != null) {
        head = n;
        Node newHead = n.next;
        newHead = head;
    } else if (n.next == null) {
        Node beforeTail = n.previous;
        beforeTail.next = null;
    } else if (n.next != null || n.previous != null) {
        Node inFront = n.previous;
        Node inBack = n.next;
        inFront.next = inBack;
        inBack.previous = inFront;
    } else {
        System.out.println("error");
    }
}

Вот тестовая программа:

 public class TestLL {
 public static void main(String[] args){ 
     /*Create a bunch of free standing nodes */ 
     Node n1= new Node(new Integer(11)); 
     Node n2= new Node(new Integer(12)); 
     Node n3= new Node(new Integer(13)); 
     Node n4= new Node(new Integer(14)); 
     Node n5= new Node(new Integer(15)); 
     Node n6= new Node(new Integer(16)); 
     Node n7= new Node(new Integer(17)); 

     /* link them */ 
     LL myLL =new LL(); 
     myLL.printList(); // prints "empty list"
     myLL.add(n1); //11 
     myLL.add(n3); //13 
     myLL.add(n5); //15 
     myLL.add(n2); //12 
     myLL.add(n7); //17 
     myLL.printList(); //should print 11, 13, 15, 12, 17; one per line 
     System.out.println(); 
     myLL.delete(n3); 
     myLL.addAfter(n4,n1); 
     myLL.printList(); //should print 11,14,15,12,17 one per line 
     System.out.println(); 
     myLL.delete(n7); 
     myLL.delete(n2); 
     myLL.printList();//should print 11,14,15 one per line 
         } 
     }

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

1 Ответ

1 голос
/ 21 октября 2011

Трудно сказать, но подход LL выглядит неправильно. Обычно работа с LL не требует какого-либо знания «узлов», так как именно реализация должна обрабатывать все детали связывания. Код, который вызывает, должен передавать объекты по своему выбору.

Я ожидаю, что использование LL будет выглядеть следующим образом.

LL myLL = new LL();
myLL.add(new Integer(1));
myLL.add(new Integer(2));
// etc

myLL.remove(new Integer(1));

Во время вызова для добавления нового узла (внутреннего класса в LL) будет создан и добавлен в конец. Удаление / удаление будет искать LL и удалять первый экземпляр, который соответствует переданному объекту.

например. Черновой эскиз реализации LL.

class LL
{
   private Node headNode = null;

   public void add(Object item)
   {
      // construct a new node
      // iterate to the last node and add new node to the end
   }

   public boolean remove(Object item)
   {
      // starting at the head node search the list until a node with the matching item is found
      // update the node pointers to "remove" the node
   }

   class Node
   {
       Node nextNode;
       Node prevNode;
       Object item;
   }
}

Я не буду заполнять реализации, так как это домашнее задание;) но вы правы, есть несколько случаев, которые нужно обработать

  • Список пуст
  • Предмет отсутствует
  • Элемент находится в главном узле
  • Элемент находится в другом узле

Удачи!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...