复制复杂链表(1)

作者: AwesomeAshe | 来源:发表于2016-03-10 21:16 被阅读39次

所谓复杂链表就是含有一个任意指向的指针的链表


1.png
//复制复杂的链表
//solution1:
struct listNode
{
    int data;
    listNode* pnext;
    listNode* psibling;
};

关于复制链表,由于这里多了一个“随意”的指针,处理这个比较麻烦。
思路1:先复制pnext节点,然后遍历查找psibling。
这样做复杂度太高,O(N2)
思路2:将原先链表中psibling指向的节点N和复制后产生的节点N'存放在一个hash表里面,这样就可以直接找到N’了
思路3:

solution3

先复制pnext,再连接psibling,然后重新组织。

复制pnext:

//first copy the nodes
//a-a'-b-b'-c-c'-...
void copynodes(listNode* l)
{
    if (!l)
        return;
    listNode* phead = l;
    while (phead->pnext)
    {
        listNode* cp = new listNode;
        cp->data = phead->data;
        cp->pnext = phead->pnext;
        phead->pnext = cp;

        phead = cp->pnext;
    }
}

再复制psibling:

//copy siblings
void copySibling(listNode* l)
{
    if (!l)
        return;
    listNode* phead = l;
    while (phead)
    {
        while (phead->psibling)
        {
            phead->pnext->psibling = phead->psibling->pnext;
        }
        phead = phead->pnext->pnext;
    }
}

再分离&重新连接:

//seperate
listNode* reconnect(listNode* l)
{
    listNode* cloneNode=NULL;
    listNode* cloneHead=NULL;
    listNode* phead = l;

    if (phead != NULL)
    {
        cloneHead = cloneNode = phead->pnext;
        phead->pnext = cloneNode->pnext;
        phead = phead->pnext;
    }
    while (phead)
    {
        cloneNode->pnext = phead->pnext;
        cloneNode = cloneNode->pnext;
        phead->pnext = cloneNode->pnext;
        phead = phead->pnext;
    }
    return cloneHead;
}

驱动程序:

listNode* clone(listNode* l)
{
    copynodes(l);
    copySibling(l);
    return reconnect(l);
}

文章参考何海涛大神文章

相关文章

  • 复制复杂链表(1)

    所谓复杂链表就是含有一个任意指向的指针的链表 关于复制链表,由于这里多了一个“随意”的指针,处理这个比较麻烦。思路...

  • 面试题35. 复杂链表的复制

    复杂链表的复制 题目描述 请实现 copyRandomList 函数,复制一个复杂链表。在复杂链表中,每个节点除了...

  • LeetCode:复制带随机指针的链表

    面试题35. 复杂链表的复制 请实现 copyRandomList 函数,复制一个复杂链表。在复杂链表中,每个节点...

  • 面试题35:复杂链表的复制

    题目:请实现函数clone(ComplexListNode head)复制一个复杂链表。在复杂链表中,每个节点除了...

  • 剑指 Offer 35. 复杂链表的复制

    剑指 Offer 35. 复杂链表的复制

  • 复杂链表的复制

    时间复杂度为O(n),需要额外空间O(n) 时间复杂度O(n),无额外空间

  • 复杂链表的复制

    题目描述:有一个复杂链表,其结点除了有一个Next指针指向下一个结点外,还有一个random指向链表中的任意结点或...

  • 复杂链表的复制

    题目描述输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),...

  • 复杂链表的复制

    题目描述 输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点)...

  • 复杂链表的复制

    题目描述: 输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点...

网友评论

    本文标题:复制复杂链表(1)

    本文链接:https://www.haomeiwen.com/subject/ptitlttx.html