题目:
Given a singly linked list L: L0→L1→…→Ln-1→Ln,
reorder it to: L0→Ln→L1→Ln-1→L2→Ln-2→…
You must do this in-place without altering the nodes' values.
For example,
Given {1,2,3,4}
, reorder it to {1,4,2,3}
.
想法:将后半段倒序后,插入前半段
代码(c):
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
void reorderList(struct ListNode* head) {
struct ListNode* mid_head ;
struct ListNode* cur_ptr,*pre_ptr;
int i,length;
mid_head = (struct ListNode *)malloc(sizeof(struct ListNode));
mid_head->val = 0;
mid_head->next = NULL;
if(head != NULL)
{
length = 0;
cur_ptr = head;
while(cur_ptr!=NULL)
{
length++;
cur_ptr = cur_ptr->next;
}
for(i = 0, pre_ptr = cur_ptr = head; i<length;i++)
{
if(i>length/2&&cur_ptr!=NULL)
{
pre_ptr->next = cur_ptr->next;
cur_ptr->next = mid_head->next;
mid_head->next = cur_ptr;
cur_ptr = pre_ptr->next;
}
else
{
pre_ptr = cur_ptr;
cur_ptr = cur_ptr->next;
}
}
pre_ptr = head;
cur_ptr = mid_head->next;
while(cur_ptr!=NULL)
{
mid_head->next = cur_ptr->next;
cur_ptr->next = pre_ptr->next;
pre_ptr->next = cur_ptr;
pre_ptr = cur_ptr->next;
cur_ptr = mid_head->next;
}
}
}
Runtime:16ms