Печать queue.peek () в Recursion печатает нерелевантные значения - PullRequest
0 голосов
/ 04 октября 2018

Я пытаюсь проверить, является ли связанный список палиндромом, используя очередь.solve() функция возвращает true , если связанный список имеет значение palindrome.Equating q.peek со значением Node возвращает false даже после того, как значения равны.Пробная печать q.peek() возвращает LList$Node@7852e922.
Я сделал Google, он говорит, что значение узла очереди используется в предыдущем функциональном вызове, не получил много.

public class LList {
    private Node head = null;

    static class Node {
        int data;
        Node next;

        Node(int d) {
            data = d;
            next = null;
        }
    }

    public void push(int d) {
        Node n = new Node(d);
        n.next = head;
        head = n;
    }

    public boolean solve(Node t, Queue q) {
        if (t == null) {
            return true;
        }

        q.add(t.data);
        if (solve(t.next, q)) {
            **System.out.println(q.peek());**//LList$Node@7852e922
            if (q.peek().equals(t.data)) {
                q.remove();
            } else {
                return false;
            }
        } else {
            return false;
        }
        return true;
    }

    public static void main(String args[]) {
        LList lList = new LList();
        lList.push(5);
        lList.push(4);
        lList.push(3);
        lList.push(4);
        lList.push(5);
        Queue<Integer> q = new LinkedList<Integer>();
        System.out.println(lList.solve(lList.head, q));
    }
}

Ответы [ 2 ]

0 голосов
/ 04 октября 2018

Как сказал @Pramod, вы добавляете узел в очередь здесь: q.dd(t)

В этом методе:

public boolean solve(Node t, Queue q) {
    if (t == null) {
        return true;
    }
    if (q == null) {
        q = new LinkedList<Integer>();
    }
    q.add(t);
    if (solve(t.next, q)) {
        **System.out.println(q.peek());**//LList$Node@7852e922
        if (q.peek().equals(t.data)) {
            q.remove();
        } else {
            return false;
        }
    } else
        return false;
    return true;
}

Вы имели в виду q.add(t.data)?

0 голосов
/ 04 октября 2018

Вы объявили очередь для целого числа, но пытаетесь вставить узел в очередь.Измените сравнение q.peek().equals(t.data) на q.peek().data == t.data, а тип очереди на Queue<Node> q = new LinkedList<Node>()

Рабочий код (добавлены комментарии для внесенных изменений):

public class LList {
  //Made head static
  private static Node head = null;

  static class Node {
    int data;
    Node next;

    Node(int d) {
        data = d;
        next = null;
    }
  }

  public void push(int d) {
    Node n = new Node(d);
    n.next = head;
    head = n;
  }

  //changed the parameter type to Queue<Integer>
  public boolean solve(Node t, Queue<Integer> q) {
    if (t == null) {
        return true;
    }
    if (q == null) {
        q = new LinkedList<>();
    }
    q.add(t.data);
    if (solve(t.next, q)) {
        System.out.println(q.peek()); //prints 5 4 3 4 5
        //changed the comparison condition.
        if (q.peek() == t.data) {
            q.remove();
        } else {
            return false;
        }
    } else
        return false;
    return true;
  }

  public static void main(String args[]) {
    LList lList = new LList();
    lList.push(5);
    lList.push(4);
    lList.push(3);
    lList.push(4);
    lList.push(5);
    System.out.println(lList.solve(lList.head, null));
  }
}

Вывод:

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