地址:328. 奇偶链表
题目
给定单链表的头节点 head
,将所有索引为奇数的节点和索引为偶数的节点分别组合在一起,然后返回重新排序的列表。
第一个节点的索引被认为是 奇数 , 第二个节点的索引为 偶数 ,以此类推。
请注意,偶数组和奇数组内部的相对顺序应该与输入时保持一致。
你必须在 O(1)
的额外空间复杂度和 O(n)
的时间复杂度下解决这个问题。
示例
思路
1. 若链表为空,则直接返回空
2. head节点即为奇数链表的头节点,head->next是偶数链表的头节点(evenhead)
3. 令2个指针odd , even分别指向奇数 / 偶数节点 ,初始化时令odd = head,even = evenhead
4. 迭代过程中先更新奇数节点再更新偶数节点。
- 更新奇数节点时:奇数节点的下一个节点为当前偶数节点的下一个节点,即odd->next = even->next,后更新odd = odd->next,此时odd位置为even的后一个节点
- 更新偶数节点时:(同奇数节点)even->next = odd->next,更新even = even->next,此时even节点为odd的后一个节点
5. 上述操作结束以后,可以分离奇偶节点。分离完毕的判断条件为:even == NULL or even ->next == NULL,因为每次都会先更新奇数节点,奇数节点的更新条件为:odd->next = even->next,自然是与even有关,所以会先进行even是否为空的判断。
6. 若此时even / even->next为空,那么odd会指向奇数链表的最后一个节点。此时需要奇偶链表首尾相接,即odd - > next = evenhead.
代码
class Solution {
public:
ListNode* oddEvenList(ListNode* head) {
int t = 1;
if(head==NULL) return head;
ListNode *evenhead = head->next;
ListNode *odd = head,*even = evenhead;
while(even!=NULL && even->next!=NULL){
//更新奇数链表
odd->next = even->next;
odd = odd -> next;
//更新偶数链表
even -> next = odd -> next;
even = even -> next;
}
odd -> next = evenhead;
return head;
}
};