Реализация кругового связанного списка с помощью обобщенных java - PullRequest
0 голосов
/ 12 сентября 2018

Я изучаю Java, и я все еще начинающий. Я написал этот код для реализации кругового связного списка, и он продолжает печатать числа, когда я пытаюсь напечатать список.это похоже на какой-то бесконечный цикл, может быть.Я даже пытался использовать отладку, но она мало что для меня сделала.Я был бы очень признателен, если бы вы могли просмотреть код и посмотреть, почему это происходит.Вот код ниже.Я также хотел бы дать мне отзыв о коде :) это класс для кругового связного списка

public class CircularLinkedList<E> implements API<E> {
    private Node<E> head;
    private int size = 0;

    public void placeAtBeginning(E element) {
        Node<E> newNode = new Node<E>(element);
        if(head == null) {
            head = newNode;
            head.setNext(head);
        }else {
            Node<E> temp = head;
            head = newNode;
            newNode.setNext(temp);
        }
        size++;
    }

    public void placeAtEnd(E element) {
        Node<E> newNode = new Node<E>(element);
        if (head == null) {
            head = newNode;
        }else {
            Node<E> temp = head;
            while (temp.getNext() != head) {
                temp = temp.getNext();
            }
            temp.setNext(newNode);
        }

        newNode.setNext(head);
        size++;
    }

    public void deleteFromBeginning() {
        Node<E> temp = head;
        while (temp.getNext() != head) {
            temp = temp.getNext();
        }
        temp.setNext(head.getNext());
        head = head.getNext();
        size --;
    }

    public void deleteFromEnd() {
        Node<E> temp = head;
        while(temp.getNext().getNext() != head) {
            temp = temp.getNext();
        }
        temp.setNext(head);
        size--;
    }

    public void print() {
        Node<E> temp = head;
        while(temp.getNext()!= head) {
            System.out.print(temp.getValue() + " , ");
            temp = temp.getNext();
        }
        System.out.print(temp.getValue());
    }
}

это класс для моего узла

public class Node<T> {
    private Node<T> next;
    private T item;

    public Node(T item) {
        this.item = item;
    }

    public void setNext(Node<T> next) {
        this.next = next;
    }

    public Node<T> getNext() {
        return this.next;
    }

    public T getValue() {
        return this.item;
    }
}

это мойmain, где я пытался протестировать его, используя int.

public class Main {
    public static void main(String [] args) {
        API <Integer> list = new CircularLinkedList<Integer>();

        int a = 10;
        int b = 3;
        int c = 15;
        int d = 8;
        int f = 9;

        list.placeAtBeginning(a);
        list.placeAtEnd(b);
        list.print();
        System.out.println();
        list.placeAtBeginning(c);
        list.placeAtBeginning(d);
        list.print();
    }
}

, это мой API, который я использовал

public interface API <E> {
    public void placeAtBeginning(E element);
    public void placeAtEnd(E element);
    public void deleteFromBeginning();
    public void deleteFromEnd();
    public void print();
}

1 Ответ

0 голосов
/ 12 сентября 2018

Ваш метод placeAtBeginning() не вставляет новый элемент в круговой список, а просто позволяет next нового элемента ссылаться на исходный круговой список.

Попробуйте это:

public void placeAtBeginning(E element)
{
  Node<E> newNode = new Node<E>(element);
  if(head == null)
  {
    head = newNode;
    head.setNext(head);
  }
  else
  {
    Node<E> last = head;
    while (last.getNext() != head)
      last = last.getNext();
    newNode.setNext(head);
    head = newNode;
    last.setNext(head);
  }
  size++;
}

Я не проверял другие методы.Они могут содержать аналогичную ошибку.

...