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}
.
将链表分成两个链表,将后面n/2个元素的链表reverse一下,然后将reverse后的链表插入另一个链表。
看了下别人的答案,找中间元素不用遍历两次,用快慢指针的方法就可以了,之前还提到过,没想起来用,因为是要找中间元素的前一个元素,所以slow指针初始值为head,fast为head->next.
class Solution {
public:
void reorderList(ListNode *head) {
if(NULL == head ||NULL == head->next){return ;}
ListNode* runner = head;
ListNode newlist(0);
ListNode *temp = NULL;
ListNode *pmove = NULL;
int nsize =0;
while(runner)
{
nsize++;
runner = runner->next;
}
runner = head;
for(int i= 0;i<(nsize+1)/2 -1;i++)
{
runner = runner->next;
}
newlist.next = runner->next;
runner->next = NULL;
//reverse the newlist
runner = newlist.next;
while(runner->next)
{
temp = runner->next;
runner->next = temp->next;
temp->next = newlist.next;
newlist.next = temp;
}
runner = head;
pmove = newlist.next;
while(runner&&pmove)
{
temp= runner->next;
runner->next = pmove;
newlist.next = pmove->next;
pmove->next = temp;
pmove = newlist.next;
runner = temp;
}
}
};