【问题标题】:Segregate even and odd nodes in a Singly Linked List在单链表中分离偶数和奇数节点
【发布时间】:2019-05-02 04:52:49
【问题描述】:

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

以下代码有效:

 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;
}

但是当我取消注释注释代码时,它不起作用。 我无法理解这种行为。 谁能解释一下?

【问题讨论】:

    标签: singly-linked-list


    【解决方案1】:

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

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

    这里,在第二行oddStart.next=null,它不仅会改变oddStartnext,还会改变tempnext。因此,如果您取消注释所有内容,您的代码将只运行一次循环(因为第一次temp 下一个节点将指向null)。

    相同的情况适用于所有 cmets。您可以在循环中printtemp.data 来验证上述事实。

    【讨论】:

    • @four 那么,您是否能够完全弄清楚为什么取消注释对您不起作用。我只解释了一种情况。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-04-25
    • 1970-01-01
    • 2014-08-31
    • 1970-01-01
    • 2012-01-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多