问题描述
- Given a singly linked list L: L 0→L 1→…→L n-1→L n
- reorder it to: L 0→L n →L 1→L n-1→L 2→L n-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}.
分析
观察题目,可以发现题目要求是将链表后半段反向隔结点插入到链表前半段,那么我们将问题拆分:
- 拆分链表(前半段、后半段):快慢指针。
- 反向插入:递归到链表后半段尾结点,依次插入到前半段即可。(注意cur指针:当前插入的位置,需要指针的指针(地址传递))
总代码
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
void reorder(ListNode *head,ListNode *head2,ListNode **cur){
if(head2==nullptr)
return;
reorder(head,head2->next,cur);
head2->next=(*cur)->next;
(*cur)->next=head2;
(*cur)=head2->next;
}
void reorderList(ListNode *head) {
if(head==nullptr || head->next==nullptr)
return;
ListNode *low=head;
ListNode *fast=head->next;
while(fast!=nullptr && fast->next!=nullptr){
low=low->next;
fast=fast->next->next;
}
ListNode *head2=low->next;
low->next=nullptr;
ListNode *cur=head;
reorder(head,head2,&cur);
}
};