题解 | #复杂链表的复制#

复杂链表的复制

http://www.nowcoder.com/practice/f836b2c43afc4b35ad6adc41ec941dba

克隆结点->克隆随机指针->奇偶链表分离

以下cur均用在原来的结点上,而克隆得到的结点都用的是tempclone_curclone_head

// 克隆, 让 A->B 变成 A->A'->B->B'
void CloneNode(RandomListNode* head) {
  if (head == nullptr) return;
  RandomListNode* cur = head;
  while (cur) {
    auto temp = new RandomListNode(cur->label);
    temp->next = cur->next;
    cur->next = temp;
    cur = temp->next;
  }
}

// 克隆, 比如 A->random = B, 那么 A'->random = B', 其中 B' == B->next
void CloneRandomPtr(RandomListNode* head) {
  if (head == nullptr) return;
  RandomListNode* cur = head;
  while (cur) {
    RandomListNode* temp = cur->next;
    if (cur->random) {  // 一定要判空!!!
      temp->random = cur->random->next;
    }
    cur = temp->next;
  }
}

// 奇偶链表分离
RandomListNode* Reconnect(RandomListNode* head) {
  if (head == nullptr) return nullptr;
  RandomListNode* cur = head;
  RandomListNode* clone_head = nullptr;
  RandomListNode* clone_cur = nullptr;
  if (cur) { // 处理只有两个结点的情况
    clone_head = cur->next;
    clone_cur = clone_head;
    cur->next = clone_cur->next;
    cur = cur->next;
  }
  while (cur) {
    clone_cur->next = cur->next;
    clone_cur = clone_cur->next;
    cur->next = clone_cur->next;
    cur = cur->next;
  }
  return clone_head;
}
RandomListNode* Clone(RandomListNode* pHead) {
  if (pHead == nullptr) return nullptr;
  CloneNode(pHead);           // 1. 克隆结点
  CloneRandomPtr(pHead);      // 2. 克隆随机指针
  return Reconnect(pHead);    // 3. 奇偶链表分离
}
全部评论

相关推荐

10-15 16:27
门头沟学院 C++
LeoMoon:建议问一下是不是你给他付钱😅😅
点赞 评论 收藏
分享
11-05 07:29
贵州大学 Java
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务