链表面试题 ---- 复杂链表的复制

一个链表的每个结点,有一个next指针指向下一个结点,还有一个random指针指向这个链表中的一个随机结点或者NULL,题目要求实现复制这个链表,返回复制后的新链表
如图所示:
这里写图片描述
1.先将单链表复制,如下图
这里写图片描述
2.找复杂指针,对新节点复杂指针赋值,如下图

这里写图片描述

while (pPre)
    {
        pCur = pPre->pNext;
        if (NULL == pPre->pRandom)
            pCur->pRandom = NULL;
        else
            pCur->pRandom = pPre->pRandom->pNext;
        pPre = pCur->pNext;
    }

3.拆结点,如下图
这里写图片描述

pPre = p1;
    Node* pPre2 = pPre->pNext;
    pCur = pPre->pNext;
    while (pCur->pNext)
    {
        pPre->pNext = pCur->pNext;
        pPre = pCur->pNext;
        pCur->pNext = pPre->pNext;
        pCur = pCur->pNext;
    }

代码如下:

//结构体
typedef int DataType;

typedef struct ListNode
{
    struct ListNode* pNext;
    struct ListNode* pRandom;
    DataType data;
}Node;
Node* BuyNode1(DataType d)
{
    Node* NewNode = (Node*)malloc(sizeof(Node));
    if (NewNode)
    {
        NewNode->data = d;
        NewNode->pNext = NULL;
        NewNode->pRandom = NULL;
        return NewNode;
    }
    else
    {
        perror("malloc::BuyNode");
        return NULL;
    }
}

Node* CopyComplexLinkList(Node* p1)//复制复杂链表
{
    Node* pPre = p1;
    Node* NewNode = NULL;
    Node* pCur = NULL;
    //在原链表每个节点后与此节点相同的新节点
    while (pPre)
    {
        NewNode = BuyNode1(pPre->data);
        NewNode->pNext = pPre->pNext;
        pPre->pNext = NewNode;
        pPre = NewNode->pNext;
    }
    //给新结点随机指针域赋值
    pPre = p1;
    while (pPre)
    {
        pCur = pPre->pNext;
        if (NULL == pPre->pRandom)
            pCur->pRandom = NULL;
        else
            pCur->pRandom = pPre->pRandom->pNext;
        pPre = pCur->pNext;
    }
    //将新结点拆下来
    pPre = p1;
    Node* pPre2 = pPre->pNext;
    pCur = pPre->pNext;
    while (pCur->pNext)
    {
        pPre->pNext = pCur->pNext;
        pPre = pCur->pNext;
        pCur->pNext = pPre->pNext;
        pCur = pCur->pNext;
    }
    return pPre2;
}
//test.c

void ComplexLinkList_test()
{
    Node node1, node2, node3, node4;
    node4.data = 4;
    node4.pNext = NULL;
    node4.pRandom = NULL;

    node3.data = 3;
    node3.pNext = &node4;
    node3.pRandom = &node3;

    node2.data = 2;
    node2.pNext = &node3;
    node2.pRandom = &node1;


    node1.data = 1;
    node1.pNext = &node2;
    node1.pRandom = &node3;



    Node* ret = CopyComplexLinkList(&node1);

}

猜你喜欢

转载自blog.csdn.net/qq_39032310/article/details/82153678