题目
给定链表A的头结点,将A中奇数结点依旧存放在链表A,偶数结点存放在链表B。
分析实现
通过分析不难得出此题通过遍历就可以解决,重点在于实现遍历的细节。
首先分析循环所需变量:
- 指针
cur
指向待判断奇偶结点; - 指针
preA
指向上一个奇数结点; - 指针
preB
指向上一个偶数结点。
由此可得出循环思路——
- 当
cur
的值为奇数时,preA
向后移动一步; - 当
cur
的值为偶数时,对于链表A-删去preA->next
,注意操作后preA->next
的值未判断奇偶,因此不需将preA
向后移动;对于链表B-将preB->next
设置为preA->next
。
对上述规则进行整理,具体实现如下:
LNode* divide(LNode* A){
LNode *B=new LNode();
B->next=NULL;
LNode *preA = A, *preB = B;
LNode *cur = preA->next;
while(cur){
if(cur->val%2==0){
// 从A中删除preA->next(cur)
preA->next = cur->next;
// 将cur(preA->next)插入到B中
cur->next = NULL;
preB->next = cur;
preB = cur;
}else{
// 将preA向后移动一步
preA = cur;
}
// 维护cur未preA的下一个结点
cur = preA->next;
}
return B;
}
总结分析
以上就是将链表中的奇数和偶数分开存放的代码实现,在分析问题的时候采用了分情况讨论的思路。
该题中有很多小细节容易被忽略,如:始终将preA
向后移动一步(这会导致当cur
的值为偶数时,cur->next
被默认为分配到链表A中)。但只要自建示例进行模拟,便能很清晰地得到正确的操作。
此外将思路转化为代码也是重点,因此有必要将思路分析地十分详细,在多次练习后这种思路到代码的转化就会越来越轻松。