题目:请实现函数ComplexListNode* Clone(ComplexListNode* pHead),复制一个复杂链表。在复杂链表中,每个结点除了有一个m_pNext指针指向下一个结点外,还有一个m_pSibling 指向链表中的任意结点或者nullptr。
方法1: 空间方法是用hash表存(N,N^)的映射 方法2: 时间方法分三步: 1 把复制后的节点N^接到N后边 2 设置每个N^的slibing指针 3. 将N和N^分开保存为原始链表和copy后的链表
void cloneNodes(ComplexListNode *head) { // 第一步:复制后的节点N^接到N后边 ComplexListNode *p = head; while (p != NULL) { ComplexListNode *temp = new ComplexListNode(); temp -> m_nValue = p -> m_nValue; temp -> m_pNext = p -> m_pNext; p -> m_pNext = temp; p = temp -> m_pNext; } } void connectSiblingNodes(ComplexListNode *head) { // 第二步:设置每个N^的slibing ComplexListNode *p = head; while (p != NULL) { ComplexListNode *temp = p -> m_pNext; if (p -> m_pSibling != NULL) { temp -> m_pSibling = p -> m_pSibling -> m_pNext; } else temp -> m_pSibling = NULL; // 可以不写,m_pSibling默认的是null p = temp -> m_pNext; } } ComplexListNode *reconnectNodes(ComplexListNode *head){ // 第三步,拆分两个链表 ComplexListNode *newHead = head -> m_pNext; // copy链表头 ComplexListNode *p = head, *cp = newHead; while (cp -> m_pNext != NULL) { p -> m_pNext = cp -> m_pNext; cp -> m_pNext = cp -> m_pNext -> m_pNext; p = p -> m_pNext; cp = cp -> m_pNext; } p -> m_pNext = cp ->m_pNext = NULL; return newHead; } ComplexListNode* Clone(ComplexListNode* pHead) // 依次调用三个函数 { if (pHead == NULL) return NULL; cloneNodes(pHead); connectSiblingNodes(pHead); return reconnectNodes(pHead); }