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

来源:互联网 发布:mac os x 10.12.6 编辑:程序博客网 时间:2024/06/05 15:23

关于单链表中复杂单链表的复制问题是比较复杂的了,当我看到这个题,我对于题目就理解了半天,更别说如何下手去分析题目了。
复杂链表结构下
有一个只想下一个数据的指针_next
有一个指针_random指向任意节点(我就对于这句话不怎么理解,指向任意节点,那么怎么创建它的链表啊,蒙了,后来想明白只需要自己指定它的_random, 如果一个测试用例可以跑通了,那么对于其他的任意_random是不是也可以跑通了? 明白了这一点,分析起来就简单多了)

typedef struct ComplexNode{    int _data ; // 数据     struct ComplexNode * _next; // 指向下一个节点的指针     struct ComplexNode * _random; // 指向随机节点(可以是链表中的任意节点 or 空) }ComplexNode;

具体分析如下:
1 . 假设创建一个5个节点的链表如下
这里写图片描述
2. 创建复杂链表
这里写图片描述
3. _next节点的复制
这里写图片描述
4. _random 节点的复制
这里写图片描述
5. 链表分离
这里写图片描述
通过分析之后写代码也就不难了

typedef struct ComplexNode{    int _data ; // 数据     struct ComplexNode * _next; // 指向下一个节点的指针     struct ComplexNode * _random; // 指向随机节点(可以是链表中的任意节点 or 空) }ComplexNode;ComplexNode* splitComplexList(ComplexNode * pList);ComplexNode* BuyComplexNode(int d){    ComplexNode* ptr = (ComplexNode*)malloc(sizeof(ComplexNode));    if(ptr == NULL){        perror("malloc");        exit(1);    }    ptr->_data = d;    ptr->_next = NULL;    ptr->_random = NULL;    return ptr;}void CopyComplexList(ComplexNode* pList){    ComplexNode* tmp = pList;    ComplexNode* newList = pList;    if(pList == NULL || pList->_next == NULL)        return;    //插入节点,在每两个节点之间插入一个节点,数据与前一个相同    while(tmp)    {        ComplexNode* next = pList->_next;        ComplexNode* insert = BuyComplexNode(tmp->_data);        insert->_next = tmp->_next;        tmp->_next = insert;        tmp = insert->_next;    }    //复杂链表的复制    newList = pList;    while(newList)    {        ComplexNode* newcomplexnode = newList->_next;        if(newList->_random != NULL)        {            newcomplexnode->_random = newList->_random->_next;        }        newList = newcomplexnode->_next;    }}//链表分离ComplexNode* splitComplexList(ComplexNode* pList){    ComplexNode* tmp = pList;    ComplexNode* list =NULL;    ComplexNode* newlist = NULL;    if(pList != NULL)    {        list = newlist = tmp->_next;        tmp->_next = list->_next;        tmp = tmp->_next;    }    while(tmp)    {        newlist->_next = tmp->_next;        newlist = newlist->_next;        tmp->_next = newlist->_next;        tmp = tmp->_next;    }    return list;}int main(){    //第一步:创建一个五个节点的链表    ComplexNode* node = NULL;    ComplexNode* node1 = BuyComplexNode(1);    ComplexNode* node2 = BuyComplexNode(2);    ComplexNode* node3 = BuyComplexNode(3);    ComplexNode* node4 = BuyComplexNode(4);    ComplexNode* node5 = BuyComplexNode(5);    node1->_next = node2;    node2->_next = node3;    node3->_next = node4;    node4->_next = node5;    node5->_next = NULL;    //创建复杂链表    node1->_random = node3;    node2->_random = node1;    node3->_random = NULL;    node4->_random = node4;    node5->_random = node2;    CopyComplexList(node1);    /*while(node1)    {        printf("%d ", node1->_data);        node1 = node1->_next;    }    node1*/    node = splitComplexList(node1);    printf("%d %d", node->_next->_random->_data);}
原创粉丝点击