在单链列表中分离偶数和奇数节点

时间:2019-05-02 04:52:50

标签: singly-linked-list

我正在尝试修改链表,以使所有偶数出现在修改后的链表中的所有奇数之前。另外,保持偶数和奇数的顺序相同。

以下代码有效:

 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 :(得分:0)

在您的代码中,evenStart, evenEnd, oddStart, oddEnd只是开始时指向null的引用,但是当遇到第一个元素(假设Odd)时,随后的代码将运行

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

此处,在第二行oddStart.next=null中,它不仅会更改next的{​​{1}},而且还会更改oddStart的{​​{1}}。因此,如果您取消注释所有内容,则您的代码将仅运行一次循环(因为第一次next下一个节点将指向temp)。

所有注释均适用相同的情况。您可以temp null循环验证上述事实。