空指针异常,无法找出原因?

时间:2019-03-16 08:03:22

标签: java nullpointerexception linked-list queue

我正在尝试编码此问题。

  

假定给定一个由n个节点组成的链表,以便每个节点存储一个整数。编写高效的Java代码,以n字符串数组形式打印链接列表中奇数的所有循环移位。   例如,如果列表是1→2→15→14→23,则输出将是一个字符串数组str,使得

str [0] = “1, 15, 2300
, str [1] = “15, 23, 1
00, and str [2] = “23, 1, 1500.
  

请注意,数字之间用   ‘,’并且它们之间没有空格。   您需要创建一个名为Shifts的类,该类具有以下方法:

public  static String[]
giveShifts (LinkedList<Integer> list)
  

。这里的列表是一个维护整数的链表

我曾尝试调试我的代码,但无济于事。它遍历所有节点,到达最后一个节点后,该值为null。我不太清楚为什么。

import java.util.Arrays;

public class Shifts
{
    public static String[] giveShifts(LinkedList<Integer> list)
    {
        String[] result = new String[list.length()];
        StackInt odds = new StackInt(list.length());
        Node curr = list.head;

        while(curr != null)
        {
            if ((Integer)curr.getValue() % 2 == 0)
            {
                odds.push(((int)curr.getValue()));

            }
            curr = curr.next;
        }


            int[] nums = new int[list.length()];
            String numsStr = "";

            while(!odds.isEmpty())
            {
            for(int i=0; i<result.length; i++)
            {
             nums[i] = odds.pop();
            }

            numsStr = Arrays.toString(nums);

            for(int j=0; j<result.length; j++)
            {
                result[j] = numsStr;
            }
        }
        return result;
    }
}

2 个答案:

答案 0 :(得分:0)

将此行curr = curr.next移动到循环的最后一行:

while(curr != null)
{
    if ((int)curr.getValue() % 2 == 0)
    {
        odds.enqueue(((int)curr.getValue()));
    }
    curr = curr.next;
}

答案 1 :(得分:0)

我不明白您显示的输出如何在String数组的每个元素中将数字之一乘以100。根据我对您问题的理解,这是一个解决方案。

import java.util.Arrays;
import java.util.Collections;
import java.util.LinkedList;
import java.util.stream.Collectors;
import java.util.stream.IntStream;

public class Shifts {

    public static void main(String[] args) {
        LinkedList<Integer> list = Arrays.asList(1, 2, 15, 14, 23)
                .stream().filter(i -> i % 2 != 0)
                .collect(Collectors.toCollection(LinkedList::new));
        int oddCount = list.size();
        String[] results = new String[oddCount];
        IntStream.range(0, oddCount).forEach(index -> {
            Collections.rotate(list, 1);
            results[index] = list.stream()
                             .map(i -> i.toString())
                             .collect(Collectors.joining(","));
        });
        Arrays.asList(results).stream().forEach(System.out::println);
    }

}

从代码中提取代码,并且由于您被允许使用Queue,因此这里提供了精致的GiveShifts方法

public static String[] giveShifts(LinkedList<Integer> list) {
        //since you need only odd numbers, filter out even ones
        list = list.stream().filter(i -> i % 2 != 0)
                .collect(Collectors.toCollection(LinkedList::new));
        int oddCount = list.size();
        String[] result = new String[oddCount];
        //type cast it to Queue as it will help understand the concept
        // shift is essentially, remove from head and add to tail in queue
        java.util.Queue<Integer> queue = list;
        for(int i=0;i<oddCount; i++){
            queue.add(queue.remove());
            result[i] = queue.stream()
                       .map(element -> element.toString())
                       .collect(Collectors.joining(","));
        }
        return result;
    }