面试题:复杂链表的复制

题目:复制一个复杂链表。复杂链表就是在链表中的每个结点除了有一个
_next指针指向下一个结点外,还有一个_sbiling指针指向NULL或链表中的任意一个结点。
复杂链表的复制分为以下三步。
1、根据原始链表的每个结点N创建对应的结点N’,并把N’链接在N后面。
这里写图片描述

void CloneNode(Node* head)
{
    Node* node = head;
    while (node!=NULL)
    {
    //复制结点
        Node* CNode = new Node(0);
        CNode->_data = node->_data;
        CNode->_next = node->_next;
        CNode->_sibling = NULL;
        node->_next = CNode;
        node=CNode->_next;
    }
}

2、设置复制出来结点的_sibling。假设原链表结点N的_sibling指向结点S,那么复制出来的结点N’就是N的_next,故N’的_sibling就指向S的_next S’。
这里写图片描述

void Connect(Node* head)
{
    Node* node = head;
    while (node != NULL)
    {
        Node* CNode = node->_next;
        if (node->_sibling != NULL)
            CNode->_sibling = node->_sibling->_next;
        node = CNode->_next;
    }
}

3、把长链表分成两个链表。把奇数位的结点连接起来就是原链表,把偶数位的结点连接起来就是复制的链表。
这里写图片描述

Node* recopy(Node* head)
{
    Node* node = head;
    Node* CNode = NULL;
    Node* CNhead = NULL;
    if (node != NULL)
    {
        CNhead =CNode= node->_next;
        node->_next = CNode->_next;
        node = node->_next;
    }
    while (node != NULL)
    {
        CNode->_next = node->_next;
        CNode = CNode->_next;
        node->_next = CNode->_next;
        node = node->_next;
    }
    return CNhead;
}

整体代码:


struct Node
{
    int _data;
    Node* _next;
    Node* _sibling;
    Node(int data)
        :_data(data)
    {}
};

Node* clone(Node* head)
{
    CloneNode(head);
    Connect(head);
    Node* CNhead = recopy(head);
    return CNhead;
}

void test1()
{
    Node* head;
    Node* n1 = new Node(1);
    Node* n2 = new Node(2);
    Node* n3 = new Node(4);
    Node* n4 = new Node(5);
    Node* n5 = new Node(6);
    Node* n6 = new Node(7);
    head = n1;
    n1->_next = n2;
    n2->_next = n3;
    n3->_next = n4;
    n4->_next = n5;
    n5->_next = n6;
    n6->_next = NULL;

    n1->_sibling = NULL;
    n2->_sibling = n4;
    n3->_sibling = n6;
    n4->_sibling = NULL;
    n5->_sibling = n3;
    n6->_sibling = NULL;

    Node* m = clone(head);


}
int main()
{
    test1();
    system("pause");
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值