2014-02-14 2 views
0

Я отправил аналогичный вопрос, но у меня все еще возникают проблемы с попыткой чередования двух списков узлов, я должен получать нуль согласно моему тестовому примеру, но он предоставляет узел, содержащий «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; 
} 
} 
+0

Не могли бы вы опубликовать метод makeList? –

+0

добавлен полный тестовый файл –

ответ

1

Похоже, вы забываете отвязать конец первого списка с самого начала вашего второго списка.

Вы ожидаете, что конец списка укажет на null в конце, но вместо этого вы оставьте ссылку на исходное начало второго списка. Когда у вас четный раздел, он работает, потому что последний элемент уже был null завершен. Однако, когда у вас есть нечетный раздел, вам нужно учитывать дополнительный элемент.

Edit: Ваш цикл может прекратить путем сочетания двух условий: либо curFirst == null или curSecond == null или обоих. Вы должны думать о том, что заставляет вашу петлю прекращаться, и какое из этих условий должно быть правдой. Кроме того, подумайте, есть ли какие-либо элементы, оставшиеся позади.

(Вы специально просили нас не писать код!)

+0

Как я могу установить последний узел списка 1 на нуль для следующего ?, мне нужно было бы сделать отдельный список копий и продолжать устанавливать его до следующего значения, пока я не доберусь до последнего узла сначала перечислите их, установите его рядом с нулем? –

Смежные вопросы