Как мне чередовать эти два связанных списка отдельно?

#java #linked-list

#java #связанный список

Вопрос:

Я пытаюсь чередовать два списка так, чтобы:

список 1 начинается как {a1,a2,a3,a4,a5} список 2 начинается как {b1,b2,b3,b4,b5}

И я хочу, чтобы они были {a1, b2,a3,b4,a5} {b1, a2, b3, a4, b5}

Это мой код:

 public void interleave(A3LinkedList other) {
  A3Node thisCurrent = this.head;
  A3Node otherCurrent = other.head;
    int count = 1;
    while(count <= this.length){
        System.out.println("List1 current at loop "  count   ": "   thisCurrent); // just to debug
        System.out.println("List2 current at loop "  count   ": "   otherCurrent);

        A3Node tempThis = thisCurrent;
        A3Node tempOther = otherCurrent;

        //if(count%2 == 0){ //if count is even, aka every second object in list
            thisCurrent = tempOther; // makes thisCurrent same as otherCurrent
            otherCurrent = tempThis; // makes otherCurrent same as temp saved
        //}


        thisCurrent = thisCurrent.next;
        otherCurrent = otherCurrent.next;
        count   ;
    }
}
  

Выходные данные методов println в цикле while показывают мне, что узлы меняются местами правильно, но конечный результат в другой программе тестирования показывает мне, что списки вообще не меняются.

Вывод изнутри цикла while:

 List1 current at loop 1: A
List2 current at loop 1: L
List1 current at loop 2: M
List2 current at loop 2: B
List1 current at loop 3: C
List2 current at loop 3: N
List1 current at loop 4: O
List2 current at loop 4: D
List1 current at loop 5: E
List2 current at loop 5: P
List1 current at loop 6: Q
List2 current at loop 6: F
List1 current at loop 7: G
List2 current at loop 7: R
  

Вывод из тестера:
{ABCDEFG}
{LMNOPQR}
Неудачный тест: testInterleave в строке 203
Неудачный тест: testInterleave в строке 204

Как можно видеть, вывод тестера не такой, каким он должен быть, он не проходит тест. Почему?

Ответ №1:

Ваш код не работает, потому что вы создаете ссылки на локальные объекты в методе и переназначаете только эти локальные ссылки. Вам нужно переназначить элементы ссылок (т.Е. A3Node.next ) и на что они указывают. Например, следующее:

 public void interleave(A3LinkedList other) {
        A3Node thisCurrent = this.head;
        A3Node otherCurrent = other.head;
        
        int count = 1;
        while(count <= this.length){
            // don't want to lose reference to other's next
            A3Node otherNext = otherCurrent.next;
            
            // now we change the references that next are pointing to
            
            // make otherCurrent.next point to thisCurrent.next
            otherCurrent.next = thisCurrent.next;
            // make thisCurrent.next point to otherNext.next (old otherCurrent.next)
            thisCurrent.next = otherNext;
            
            thisCurrent = thisCurrent.next;
            otherCurrent = otherCurrent.next;
            count  = 1;
        }
    }