很简单,就是最中间的node处理要注意下。。。直接代码。
ListNode* reverseList(ListNode* head){
if (!head){
return NULL;
}
if (!head->next){
return head;
}
ListNode* pre = NULL;
ListNode* cur = head;
while (cur->next){
ListNode* tmp = cur->next;
cur->next = pre;
pre = cur;
cur = tmp;
}
cur->next = pre;
return cur;
}
void reorderList(ListNode *head) {
if (!head || !head->next){
return;
}
int count = 0;
ListNode* cur = head;
while (cur){
count++;
cur = cur->next;
}
int leftcount = (count % 2 == 0) ? (count / 2) : (count / 2 + 1);
int rightcount = count - leftcount;
int half = leftcount;
cur = head;
ListNode* pre = head;
while (half){
pre = cur;
cur = cur->next;
half--;
}
pre->next = NULL;
cur = reverseList(cur);
half = min(leftcount, rightcount);
ListNode* tmp = head;
while (half){
half--;
ListNode* a = tmp->next;
ListNode* b = cur->next;
tmp->next = cur;
cur->next = a;
tmp = a;
cur = b;
}
}