题目:
给定一个单链表的头节点head,链表长度为N,如果N为偶数,那么前N/2个节点算作左半区,后N/2个节点算作右半区;如果N为奇数,那么前N/2个节点算作左半区,后N/2+1个节点算作右半区。
左半区从左到右依次是L1 -> L2 ->…,右半区从左到右依次是R1 -> R2 ->…,请将单链表调整成L1 -> R1 -> L2 -> R2 ->…的形式。
例如:
1->2->3->4 调整后:1->3->2->4
1->2->3->4->5 调整后:1->3->2->4->5
要求:
如果链表长度为N,时间复杂度请达到O(N),额外空间复杂度请达到O(1)
void relocateList(struct ListNode* head) {
//处理特殊情况
if (head == NULL&&head->next == NULL&&head->next->next == NULL)
return;
ListNode* pCur = head;
vector<int> v;
//将链表中的值存入数组中
while (pCur != NULL){
v.push_back(pCur->val);
pCur = pCur->next;
}
pCur = head;
int i = 0;
int left = 0;
int right = v.size()/2;//右半区间开始的位置
while (i < v.size() - 1 && pCur != NULL){
//偶数结点(从0开始)
if (i % 2 == 0){
pCur->val = v[left++];
pCur = pCur->next;
}
//奇数结点
else if (i % 2 != 0){
pCur->val = v[right++];
pCur = pCur->next;
}
++i;
}
}