我正在尝试编码此问题。
假定给定一个由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;
}
}
答案 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;
}