我正在尝试修改链表,以使所有偶数出现在修改后的链表中的所有奇数之前。另外,保持偶数和奇数的顺序相同。
以下代码有效:
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;
}
但是当我取消注释代码时,它不起作用。 我无法理解这种行为。 有人可以解释吗?
答案 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
循环验证上述事实。