复制链表

题目:已知一链表,每个节点除了有一个指向下一节点的指针外,还有一随机指针指向链表中的任意节点(可能为空,也有可能为自身),请复制一个链表,要求节点的顺序以及节点上的随机指针指向的节点位置和原链表一致。

 

 

 

这个题目有个很巧妙的解法,可以达到O(n)的效率,其中心思想是把原始链表和复制链表先合并为一个有固定顺序的链表,然后给复制链表中每个节点的随机指针复制,最后再打断链表恢复原样。

 

 

typedef struct Node {
    int nData;
    Node* pNext;
    Node* pRandom;
} Node;

Node* DuplicateList(Node* pSrcListHead)
{
    if (pSrcListHead == NULL)
        return NULL;
 
    Node* pNode = pSrcListHead;
    while (pNode != NULL)
    {
        Node* pNewNode = new Node;
        pNewNode->nData = pNode->nData;
        pNewNode->pNext = pNode->pNext;
        pNewNode->pRandom = pNode->pRandom;

        pNode->pNext = pNewNode;
        pNode = pNewNode->pNext;
    }
 
    Node* pDestListHead = pSrcListHead->pNext;

    pNode = pSrcListHead;
    while (pNode != NULL)
    {
        pNode->pNext->pRandom = pNode->pRandom->pNext;
        pNode = pNode->pNext->pNext;
    }

    pNode = pSrcListHead;
    Node* pNode2 = pNode->pNext;
    while (pNode != NULL)
    {
        pNode->pNext = pNode2->pNext;
        pNode = pNode->pNext;

        if (pNode)
            pNode2->pNext = pNode->pNext;
        else
            pNode2->pNext = NULL;

        pNode2 = pNode2->pNext;
    }

    return pDestListHead;
}

 

    不过目前还未考虑到原始链表有环的情况,如果原始链表有环,则应该先求出环的入口点,然后利用上面的方法进行链表复制。

 

 

原文地址:http://hi.baidu.com/%B3%A3%D1%C5%C3%F4/blog/item/173d50ae523a0ede7dd92a63.html

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值