1、题目描述
输入一个单链表,对它重新排序,0,n,1,n-1,2,n-2,……
2、思路
把链表分成前后两部分。后部分逆序。
再按照两个链表交叉的顺序形成新的链表。
3、代码
void reorderList(ListNode* head) {
if(!head||!head->next)
return;
ListNode* p = head;
ListNode* q = head->next;
while(q&&q->next){
p=p->next;
q=q->next->next;
}
q=p->next;
p->next=NULL;
q=rev(q);
ListNode* h = new ListNode(-1);
ListNode* hh = h;
while(head&&q){
h->next = head;
head=head->next;
h=h->next;
h->next = q;
q=q->next;
h=h->next;
}
if(head)
h->next=head;
head = hh->next;
}
ListNode* rev(ListNode* head){
if(!head||!head->next) return head;
ListNode* p = head;
ListNode* q = head->next;
ListNode* r;
p->next = NULL;
while(q->next){
r = q->next;
q->next = p;
p = q;
q = r;
}
q->next = p;
return q;
}