Почему мой метод не сортирует мой связанный список в алфавитном порядке?

#java #linked-list #nodes

#java #связанный список #узлы

Вопрос:

 public class doubleLinkedList {

    class Node {
      String value;
      Node prev;
      Node next;

      Node(String val, Node p, Node n) {
        value = val;
        prev = p;
        next = n;
      }

      Node(String val) {
        value = val;
        prev = null;
        next = null;
      }
    }

    Node first;
    Node last;

    public doubleLinkedList() {
      first = null;
      last = null;
    }

    public boolean isEmpty() {
      if (first == null)
        return true;
      else
        return false;
    }

    /**The size method returns the length of the linked list
     * @return the number of element in the linked list
    */
    public int size() {
      int count = 0;
      Node traverse = first;
      while (traverse != null) {
        count  ;
        traverse = traverse.next;
      }
      return count;
    }


    public void add(String element) {

      if (isEmpty()) {
        first = new Node(element);
        last = first;
      } else {

        Node p = first;
        Node elementTobeAdded;
        while (((p.value).compareTo(element)) > 0 amp;amp; p.next != null) {
          p = p.next;
        }

        if (p.next != null) {
          elementTobeAdded = new Node(element, p, p.next);
          p.next.prev = elementTobeAdded;
          p = elementTobeAdded.prev;
        } else {
          elementTobeAdded = new Node(element, p, null);
          p.next = elementTobeAdded;
          elementTobeAdded.next = null;
          last = elementTobeAdded;
        }

      }
    }

    public void printForward() {
      Node printNode = first;
      while (printNode != null) {
        System.out.print(printNode.value   ", ");
        printNode = printNode.next;
      }
    }
  }
  public class test {

    public static void main(String[] args) {
      doubleLinkedList car = new doubleLinkedList();
      car.add("Jeep");
      car.add("benz");
      car.add("Honda");
      car.add("Lexus");
      car.add("BMW");
      car.printForward();
    }
  }
  

Мой метод add пытается добавить узлы в список в алфавитном порядке. Мой метод printForward распечатывает каждый элемент в списке.
В моем основном методе он выводит «Jeep, benz, Honda, BMW», которые расположены не в алфавитном порядке.

Комментарии:

1. Вы просматривали свой код с помощью отладчика?

2. ericlippert.com/2014/03/05/how-to-debug-small-programs

Ответ №1:

Измените регистр not empty для вашего метода add с этого

   Node p = first;

  Node elementTobeAdded;

  while(((p.value).compareTo(element)) > 0 amp;amp; p.next != null)
  {
    p = p.next;
  }

  if(p.next != null)
  {
  elementTobeAdded = new Node(element,p,p.next);
  p.next.prev = elementTobeAdded;
  p = elementTobeAdded.prev;
  }

  else
  {
    elementTobeAdded = new Node(element, p, null);
    p.next = elementTobeAdded;
    elementTobeAdded.next = null;
    last = elementTobeAdded;
  }
  

к этому:

   Node p = first;
  while (p.value.compareTo(element) < 0 amp;amp; p.next != null) {
    p = p.next;
  }
  if (p.value.compareTo(element) > 0) {
    Node toAdd = new Node(element, p.prev, p);
    p.prev = toAdd;
    if (toAdd.prev != null) {
        toAdd.prev.next = toAdd;
    }else {
      first = toAdd;
    }
  }else {
    Node toAdd = new Node(element, p, p.next);
    p.next = toAdd;
    if (toAdd.next != null) {
        toAdd.next.prev = toAdd;
    }else {
      last = toAdd;
    }
  }
  

Здесь было много ошибок. Самым большим было то, что вы никогда не проверяли случай, когда новый элемент должен быть вставлен в начало списка. Новый элемент всегда вставлялся после первого элемента, даже если он должен был быть первым.

Обратите внимание, что «benz» идет в конце, потому String.compareTo что метод рассматривает заглавные буквы как идущие перед строчными буквами.

Ответ №2:

Это не связанный список… Вы написали какую-то очередь (с дополнительной возможностью удаления ее из очереди).

По поводу вашего вопроса — у вас ошибка в вашем методе «добавить» — по крайней мере, вы не проверяете, нужно ли двигаться вперед. Возможно, у вас есть другие ошибки, но слишком сложно читать такие стилизованные источники (пожалуйста, исправьте форматирование вашего вопроса)…