码迷,mamicode.com
首页 > 其他好文 > 详细

剑指offer (27) 复杂链表的复制

时间:2014-06-24 13:57:17      阅读:287      评论:0      收藏:0      [点我收藏+]

标签:des   style   class   blog   code   http   

题目:请实现一个函数,复制一个复杂链表,在复杂链表中,每个结点除了有一个m_pNext指针指向下一个结点,还有一个m_pSibling指向链表中的任意节点或者NULL

struct ComplexListNode {
    int              m_nValue;
    ComplexListNode* m_pNext;
    ComplexListNode* m_pSibling;
};

bubuko.com,布布扣 

方法一:

step1. 复制原始链表的每一个节点,并用m_pNext链接起来

step2. 设置每个结点的m_pSibling指针

由于m_pSibling指针可以指向任意结点,所以定位每个结点的m_pSibling指针都需要从原始链表的头结点开始找

定位每个结点的m_pSibling指针都需要O(n)遍历链表,所以该方法的时间复杂度为 O(n^2)

 

方法二:用空间换时间,使用一个大小为O(n)的哈希表,将方法一的查找操作从O(n)降为O(1)

step1. 复制原始链表的每一个节点N,创建对应结点N‘, 并用m_pNext链接起来,同时将<N, N‘>的配对信息放在一个哈希表中

step2. 如果原始链表中结点N的m_pSibling指向结点S,那么复制链表中,对应的N‘应该指向S‘ ,由于有哈希表,我们可以根据S找到S’

 

方法三:

bubuko.com,布布扣 

void CloneNodes(ComplexListNode* pHead)
{
    ComplexListNode* pNode = pHead;
    while (pNode != NULL) {
        ComplexListNode* pCloned = new ComplexListNode();
        pCloned->m_nValue = pNode->m_nValue;
        pCloned->m_pNext = pNode->m_pNext;
        pCloned->m_pSibling = NULL;

        pNode->m_pNext = pCloned;
        pNode = pCloned->m_pNext;
    }
}

 

bubuko.com,布布扣 

void ConnectSiblings(ComplexListNode* pHead)
{
    ComplexListNode* pNode = pHead;
    while (pNode != NULL) {
        ComplexListNode* pCloned = pNode->m_pNext;
        if (m_pNext->m_pSibling != NULL) {
            pCloned->m_pSibling = pNode->m_pSibling->m_pNext;
        }
        pNode = pCloned->m_pNext;
    }
}

 

bubuko.com,布布扣  

ComplexListNode* ReconnectNodes(ComplexListNode* pHead)
{
    ComplexListNode* pNode = pHead;
    ComplexListNode* pClonedHead = NULL;
    ComplexListNode* pClonedNode = NULL;

    if (pNode != NULL) {
        pClonedHead = pClonedNode = pNode->m_pNext;
        pNode->m_pNext = pClonedNode->m_pNext;
        pNode = pNode->m_pNext;
    }

    while (pNode != NULL) {
        pClonedNode->m_pNext = pNode->m_pNext;
        pClonedNode = pClonedNode->m_pNext;
        pNode->m_pNext = pClonedNode->m_pNext;
        pNode = pNode->m_pNext;
    }
    return pClonedNode;
}

 

剑指offer (27) 复杂链表的复制,布布扣,bubuko.com

剑指offer (27) 复杂链表的复制

标签:des   style   class   blog   code   http   

原文地址:http://www.cnblogs.com/wwwjieo0/p/3804987.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!