Я отправил аналогичный вопрос, но у меня все еще возникают проблемы с попыткой чередования двух списков узлов, я должен получать нуль согласно моему тестовому примеру, но он предоставляет узел, содержащий «3D ».Переплетение двух списков узлов в java
кажется, что список продолжается по пути дольше, чем нужно, когда я смотрю на него в режиме отладки в eclipse. проверил мой метод длины и вернул правильную длину.
Я не понимаю, почему кажется, что мои узлы продолжаются, когда это должен быть список из 13 узлов в тестовом примере, опубликованном ниже.
код должен делать следующее Например: {«KH», «4C», «8C», «QC», «3D», «7D», «JD»} становится {«KH», «4C», , "8C", "QC"} {"3D", "7D", "JD"} (если в этом случае списки имеют нечетное число узлов, то первый список длиннее) и возвращает список {"KH », "3D", "4C", "7D", "8C", "JD", "КК"}.
Мне нужно решить это с помощью предоставленного класса узлов и не использовать статические переменные, массивы или коллекции Java. пожалуйста, не просто отправляйте код, я действительно должен научиться манипулировать узлами, но не понимаю, что я делаю неправильно.
public class ListShuffleExample {
public static Node<String> shuffle(Node<String> deck) {
if (deck == null) {
return null;
}
if (deck.next == null) {
return deck;
}
Node<String> lf = deck;
int decklength = length(lf);
int halflength;
Node<String> first = deck;
Node<String> second = deck;
if (decklength % 2 == 0) {
halflength = decklength/2;
} else {
halflength = (decklength/2) + 1;
}
for (int i = 0; i < halflength; i++) {
second = second.next;
}
Node<String> curFirst = first;
Node<String> curSecond = second;
while (curFirst != null && curSecond != null) {
// save the next one of the first list
Node<String> nextFirst = curFirst.next;
// set the next one of the first list to the first one of the second
// list
curFirst.next = curSecond;
// save the next one of the second list
Node<String> nextSecond = curSecond.next;
// set the next one after the inserted item to the previous next of
// the first list
curSecond.next = nextFirst;
// set the current references to the next ones
curFirst = nextFirst;
curSecond = nextSecond;
}
return first;
}
public static int length(Node<String> adeck) {
int length = 0;
while (adeck != null) {
length++;
adeck = adeck.next;
}
return length;
}
}
тестовые примеры
import static org.junit.Assert.*;
import java.lang.reflect.Field;
import org.junit.Test;
public class ListShuffleExampleTest {
private static final Node<String> _AH = new Node<String>("AH");
private static final Node<String> _5H = new Node<String>("5H");
private static final Node<String> _9H = new Node<String>("9H");
private static final Node<String> _KH = new Node<String>("KH");
private static final Node<String> _4C = new Node<String>("4C");
private static final Node<String> _8C = new Node<String>("8C");
private static final Node<String> _QC = new Node<String>("QC");
private static final Node<String> _3D = new Node<String>("3D");
private static final Node<String> _7D = new Node<String>("7D");
private static final Node<String> _JD = new Node<String>("JD");
private static final Node<String> _2S = new Node<String>("2S");
private static final Node<String> _6S = new Node<String>("6S");
private static final Node<String> _TS = new Node<String>("TS");
private static <T> Node<T> makeList(Node<T>... nodes) {
for (int i = 0; i < nodes.length-1; i++) {
nodes[ i ].next = nodes[ i+1 ];
}
nodes[ nodes.length-1 ].next = null;
return nodes[ 0 ];
}
@Test
public void testReflection() {
Class<?> iClass = ListShuffleExample.class;
for (Field field : iClass.getDeclaredFields()) {
if (!field.isSynthetic()) {
fail("class should not have any fields");
}
}
}
@Test
public void testNull() {
Node<String> actual = ListShuffleExample.shuffle(null);
//expected: NULL
assertEquals("", null, actual);
}
@Test
public void testOddDivide10() {
@SuppressWarnings("unchecked")
Node<String> input = makeList(_QC);
Node<String> actual = ListShuffleExample.shuffle(input);
for (Object expected : new Object[]{ _QC }) {
assertEquals("Incorrect value", expected, actual);
actual = actual.next;
}
assertNull("Incorrect result", actual);
}
@Test
public void testOddDivide21() {
@SuppressWarnings("unchecked")
Node<String> input = makeList(_AH, _5H, _9H);
Node<String> actual = ListShuffleExample.shuffle(input);
// _AH, _5H
// _9H
for (Object expected : new Object[]{ _AH, _9H, _5H }) {
assertEquals("Incorrect value", expected, actual);
actual = actual.next;
}
assertNull("Incorrect result", actual);
}
@Test
public void testEvenDivide22() {
@SuppressWarnings("unchecked")
Node<String> input = makeList(_2S, _6S, _TS, _AH);
Node<String> actual = ListShuffleExample.shuffle(input);
// _2S, _6S
// _TS, _AH
for (Object expected : new Object[]{ _2S, _TS, _6S, _AH }) {
assertEquals("Incorrect value", expected, actual);
actual = actual.next;
}
assertNull("Incorrect result", actual);
}
@Test
public void testOddDivide43() {
@SuppressWarnings("unchecked")
Node<String> input = makeList(_KH, _4C, _8C, _QC, _3D, _7D, _JD);
Node<String> actual = ListShuffleExample.shuffle(input);
// _KH, _4C, _8C, _QC,
// _3D, _7D, _JD
for (Object expected : new Object[]{ _KH, _3D, _4C, _7D, _8C, _JD , _QC }) {
assertEquals("Incorrect value", expected, actual);
actual = actual.next;
}
assertNull("Incorrect result", actual);
}
@Test
public void testEvenDivide44() {
@SuppressWarnings("unchecked")
Node<String> input = makeList(_5H, _9H, _KH, _4C, _8C, _QC, _3D, _7D);
Node<String> actual = ListShuffleExample.shuffle(input);
// _5H, _9H, _KH, _4C,
// _8C, _QC, _3D, _7D
for (Object expected : new Object[]{ _5H, _8C, _9H, _QC, _KH, _3D, _4C, _7D }) {
assertEquals("Incorrect value", expected, actual);
actual = actual.next;
}
assertNull("Incorrect result", actual);
}
@Test
public void testMany() {
@SuppressWarnings("unchecked")
Node<String> input = makeList(_AH, _5H, _9H, _KH, _4C, _8C, _QC, _3D, _7D, _JD, _2S, _6S, _TS);
Node<String> actual = ListShuffleExample.shuffle(input);
// _AH, _5H, _9H, _KH, _4C, _8C, _QC
// _3D, _7D, _JD, _2S, _6S, _TS
for (Object expected : new Object[]{ _AH, _3D, _5H, _7D, _9H, _JD, _KH, _2S, _4C, _6S, _8C, _TS, _QC }) {
assertEquals("Incorrect value", expected, actual);
actual = actual.next;
}
assertNull("Incorrect result", actual);
}
}
класс Node
public final class Node<T> {
public final T value;
public Node<T> next;
public Node(T _value) {
this(_value, null);
}
public Node(T _value, Node<T> _next) {
value = _value;
next = _next;
}
@Override
public String toString() {
return "" + value;
}
}
Не могли бы вы опубликовать метод makeList? –
добавлен полный тестовый файл –