void reorderList(ListNode *head) {
int node_sum = 0;
ListNode* cur_node = head;
while(cur_node != NULL)
{
node_sum++;
cur_node = cur_node->next;
}
ListNode* list1 = head;
int cnt = 1;
cur_node = head;
while(cnt < (node_sum+1)/2)
{
cur_node = cur_node->next;
cnt++;
}
ListNode* list2 = NULL;
if(cur_node != NULL)
{
list2 = cur_node->next;
cur_node->next = NULL;
}
ListNode* list2_reverse = list2;
ListNode* unreversed_list = NULL;
if(list2 != NULL)
{
unreversed_list = list2->next;
list2_reverse->next = NULL;
}
while(unreversed_list != NULL)
{
ListNode* unreversed_node = unreversed_list;
unreversed_list = unreversed_list->next;
unreversed_node->next = list2_reverse;
list2_reverse = unreversed_node;
}
ListNode* node1 = list1;
ListNode* node2 = list2_reverse;
while(node2 != NULL)
{
ListNode* node1_next = node1->next;
ListNode* node2_next = node2->next;
node1->next = node2;
node2->next = node1_next;
node1 = node1_next;
node2 = node2_next;
}
}
第一步,将链表分割成两半(前一半的节点数 ≥ 后一半的节点数)
第二步,翻转后一半链表
第三部,将后一半链表插入到前一半链表