重排链表

2018-11-05  本文已影响0人  小码弟

形如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;
  }
上一篇 下一篇

猜你喜欢

热点阅读