在逆转链表队列时遇到问题

时间:2015-12-06 10:29:26

标签: java linked-list

这是家庭作业的一部分,我不会精通Java,因为我还是学生,并且正在抽出时间学习,所有的反馈都非常感谢!

我正在努力反转通过链表初始化的队列,我无法找到一种更简单的方法,所以我最终将每个值保存到一个数组中,然后反向打印数组。

这是我提出的方法:

@Override
public void reverseDisplay() {
    System.out.println("The values of this linked list in reverse are: ");
    T[] hold;
    hold = (T[]) new Object[numElements];
    int count = 0;
    do {
        rear = front;
        hold[count] = front.getInfo();
        count++;
        front = front.getLink();
    } while (rear.getLink() != null);
    for (int i = hold.length - 1; i > 0; i--) {
        System.out.print((i+1) + ": ");
        System.out.println(hold[i]);
    }
}

这是我的主要课程:

public static void main(String[] args) {
    Scanner A1 = new Scanner(System.in);
    String input = "";
    LinkedUnbndQueue Q = new LinkedUnbndQueue();
    while (!"-1".equals(input)) {
            System.out.println("Enter the next value of your queue");
            input = A1.nextLine();
            Q.enqueue(input);
        }
    //Q.display();
    //Q.retElements();
    Q.reverseDisplay();
}

在运行时,一切都运行正常,但是当我输入-1时,我会抛出一个“ArrayIndex out of bounds exception”,它将我带到这一行:

            hold[count] = front.getInfo();

任何想法我可能在这里做错了吗?如果需要任何额外信息,请告诉我!

这是我正在编辑的原始课程:http://www.cs.nyu.edu/courses/fall12/CSCI-GA.1133-001/programs/Queues/LinkedUnbndQueue.txt

答案@ luk2302解决了我遇到的问题! 但现在我需要弄清楚如何在反转列表之前运行我的显示方法后重置链表。

这是我的显示方法:

@Override
public void display() {
    System.out.println("The values of this linked list are: ");
    int counter = 1;
    do {
        rear = front;
        System.out.print((counter) + ": ");
        counter++;
        System.out.println(front.getInfo());
        front = front.getLink();
    } while (rear.getLink() != null);
}

2 个答案:

答案 0 :(得分:0)

尝试将A1.nextLine()放在while循环之前,如下所示:

   System.out.println("Enter the next value of your queue");
    String input = A1.nextLine();
   while (!"-1".equals(input)) {
        Q.enqueue(input);
    }

或者添加新条件或这样的计数器:

  while (!"-1".equals(input) && condition) {
        count++;
        Q.enqueue(input);
    }

计数器:

 int count = 0 ;
 while (!"-1".equals(input) && count < 5) {
        count++;
        Q.enqueue(input);
    }

答案 1 :(得分:0)

首先,您应该忽略-1值。您当前的代码将-1附加到列表中,然后打印列表。我猜测-1实际上不应该附加:

while (true) {
    System.out.println("Enter the next value of your queue");
    input = A1.nextLine();
    if ("-1".equals(input)) {
        break;
    }
    Q.enqueue(input);
}

然后让我们去实际逆转:

我不知道你目前从哪里获得numElements,因此我的功能将从以下内容开始:

void reverseDisplay() {        
    System.out.println("The values of this linked list in reverse are: ");

    if (isEmpty())
        return;

    int numElements = 1;
    LLNode elem = front;
    while ((elem = elem.getLink()) != null) {
        numElements++;
    }
    // ...
}

现在我们知道实际列表的长度。保留剩余的代码将打印

  

输入队列的下一个值
  0
  输入队列的下一个值
  10个
  输入队列的下一个值
  30个
  输入队列的下一个值
  50个
  输入队列的下一个值
  -1
  反向链接列表的值为:
  4:50
  3:30   2:10
  1:0

请注意,写入front和/或rear会破坏List的剩余逻辑,您不得更改其值,只能从中读取。