题目大意
给定一个单链表 L:L0→L1→…→Ln-1→Ln , 将其重新排列后变为: L0→Ln→L1→Ln-1→L2→Ln-2→…
你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。
思路
先找到中间节点,q用两次next,p用一次next,等q为空,那么p就是中间节点对p后面的节点进行头插法,形成逆序,如123456,变成123465,*注意是465*然后进行断链,形成1234和65两条链最后进行和链162534
代码实现
void reorderList(ListNode
* head
) {
ListNode
* p
=head
,*q
=head
,*r
,*s
=head
;
if(!head
)
return ;
while(q
->next
){
q
=q
->next
;
p
=p
->next
;
if(q
->next
)
q
=q
->next
;
}
q
=p
->next
;
p
->next
=nullptr;
while(q
){
r
=q
->next
;
q
->next
=p
->next
;
p
->next
=q
;
q
=r
;
}
q
=p
->next
;
p
->next
=nullptr;
while(q
){
r
=q
->next
;
q
->next
=s
->next
;
s
->next
=q
;
s
=q
->next
;
q
=r
;
}
}