形如L1->L2->...->Ln的链表,编写函数将链表重新排列成L1->Ln->L2->Ln-1->...,要求就地修改,不能修改数据域
思路:
第一步:定位到中间节点
第二步:从中间节点断开,逆置后半段链表
第三步:依次合并两段链表
LinkNode* FindMiddleNode(LinkNode* head)
{
LinkNode* slow = head;
LinkNode* fast = head->next;
LinkNode* pre_slow = head;
while(fast&&fast->next)
{
fast = fast->next->next;
pre_slow = slow;
slow = slow->next;
}
pre_slow = NULL;
return slow;
}
void ReverseList(LinkNode* head)
{
LinkNode* pre = head;
LinkNode* cur = head->next;
LinkNode* next = head->next;
pre->next = NULLl;
while(cur)
{
next = cur->next;
cur->next = pre;
pre = cur;
next = cur;
}
return pre;
}
void ReorderList(LinkNode* head)
{
if(head == NULL || head->next == NULL)
return;
LinkNode* p1 = head->next;
LinkNode* mid = FindMiddleNode(head);
LinkNode* p2 = ReverseList(mid);
LinkNode* tmp = NULL;
while(p1->next)
{
tmp = p1->next;
p1->next = p2;
p1 = tmp;
tmp = p2->next;
p2->next = p1;
p2 = tmp;
}
p1->next = p2;
}
网友评论