Разделять четные и нечетные узлы в односвязном списке - PullRequest
0 голосов
/ 02 мая 2019

Я пытаюсь изменить связанный список таким образом, чтобы все четные числа появлялись перед всеми нечетными числами в измененном связанном списке. Также сохраняйте порядок четных и нечетных чисел одинаковым.

Ниже работает код:

 void segregateEvenOdd() 
{   
    if(head==null) return;
    Node temp=head,evenStart=null,evenEnd=null,oddStart=null,oddEnd=null;

    while(temp!=null){
        if(temp.data%2==0){
            if(evenStart==null){
                evenStart=temp;
                //evenStart.next=null;
                evenEnd=evenStart;
            }
            else{
                evenEnd.next=temp;
                evenEnd=evenEnd.next;
            //  evenEnd.next=null;
            }
        }
        else{
            if(oddStart==null){
                oddStart=temp;
                //oddStart.next=null;
                oddEnd=oddStart;

            }
            else{
                oddEnd.next=temp;
                oddEnd=oddEnd.next;
                //oddEnd.next=null;
            }
        }
        temp=temp.next;
    }

    if(oddStart==null || evenStart==null) return;

    evenEnd.next=oddStart;
    oddEnd.next=null;
    head=evenStart;
}

Но когда я раскомментирую закомментированный код, он не работает. Я не могу понять это поведение. Может кто-нибудь объяснить?

1 Ответ

0 голосов
/ 02 мая 2019

В вашем коде evenStart, evenEnd, oddStart, oddEnd - это просто ссылки, которые при запуске указывают на null, но когда он встречает первый элемент (предположим, Odd), тогда следующий код будет запускать

if(oddStart==null){
   oddStart=temp;
   oddStart.next=null;
   oddEnd=oddStart;
}

Здесь, во второй строке oddStart.next=null, он не только изменит next из oddStart, но также изменит next из temp. Благодаря этому, если вы раскомментируете все, ваш код будет запускать цикл только один раз (потому что в первый раз temp следующий узел будет указывать на null).

То же относится ко всем комментариям. Вы можете print temp.data в цикле, чтобы проверить вышеуказанный факт.

...