Я создаю двойной связанный список в Java, когда я пытаюсь получить какую-либо информацию, кажется, что следующий и предыдущий узлы всегда нулевые - PullRequest
0 голосов
/ 20 марта 2020

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

Во время отладки я могу подтвердить, что порядок списка правильный, я могу переключаться между addLast и addFirst и всегда возвращать то, что должно быть первым элементом, но в остальном я не знаю. первый всегда пишется в head.info, и во время отладки я вижу это, но тогда prev и next все равно null. спасибо заранее!

public class DoubleLinkedList {

  private DoubleNode head;

  public DoubleLinkedList() {
    head = null;
  }

  public class DoubleNode {
    int info;
    DoubleNode prev;
    DoubleNode next;

    public DoubleNode(int key) {
      info = key;
      prev = next = null;
    }
  }


  public DoubleNode search(int key) {
    DoubleNode current = this.head;

    while (current != null && current.info != key) {
      current = current.next;
    }
    return current;
  }

  public void addFirst(int key) {
    this.head = new DoubleNode(key);
  }

  public void addLast(int key) {
    DoubleNode node = new DoubleNode(key);
    DoubleNode current;

    if (head == null) {
      this.head = node;
    } else {
      current = this.head;
      while (current.next != null) {
        current = current.next;
        current.next = node;
        node.prev = current;
      }
    }
  }

  public int delete(int key) {
    DoubleNode current, sent;
    current = search( key );
    if (current != null) {
      sent = delete( current );
      return sent.info;
    } else {
      return -1;
    }
  }

  private DoubleNode delete(DoubleNode node) {
    if (node.prev != null) {
      (node.prev).next = node.next;
    } else {
      this.head = node.next;
    }
    if (node.next != null) {
      (node.next).prev = node.prev;
    }
    return node;
  }

  public String toString() {
    String string = "";
    while (head != null) {
      string += head.info + " ";
      head = head.next;
    }
    return string;
  }

  public static void main(String[] args) {
    DoubleLinkedList test = new DoubleLinkedList();
    test.addLast( 3 );
    test.addLast( 5 );
    test.addFirst( 7 );
    System.out.println(test);
    System.out.println( "Search: " + test.search( 1 ) );
  }
}

Результаты получаются как:

7,
Search: null

Ответы [ 2 ]

0 голосов
/ 20 марта 2020

Взгляните на этот пример:

public class Test {
public static void main(String[] args) {
    List list = new List();
    list.addNode("1");
    list.addNode("2");
    list.addNode("3");
    System.out.println(list);// not implemented
}
}

class List {
Node head;
Node tail;

class Node {
    Node next;
    Node previous;
    String info;

    public Node(String info) {
        this.info = info;
    }
}

void addNode(String info) {
    Node node = new Node(info);
    if (head == null) {
        head = tail = node;
    } else if(tail == head){
        Node next = new Node(info);
        tail.next = next;
        head = next;
        head.previous = tail;
    } else{
        Node next = new Node(info);
        Node current = head;
        head.next =next;
        head = next;
        head.previous = current;
    }
}
}
0 голосов
/ 20 марта 2020

Ваш метод addFirst в настоящее время не устанавливает свойство next новой головы. Это должно быть что-то вроде этого:

public void addFirst(int key) {
    DoubleNode node = new DoubleNode(key);
    node.next = this.head;
    this.head = node; 
}
...