单链表面试题--复杂链表的复制
来源:互联网 发布: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);}
阅读全文
0 0
- 单链表面试题--复杂链表的复制
- 链表面试题之复杂链表的复制
- 链表面试题(进阶)&&复杂链表的复制
- 链表面试题之复杂链表的复制
- 链表面试题总结----(可能带环相交问题+复杂链表的复制)
- 单链表面试题
- 单链表面试题
- 单链表面试题
- 单链表面试题
- 单链表面试题
- 单链表面试题~带环链表的入口点
- 【面试题】复杂链表的复制
- 面试题:复杂链表的复制
- 单链表面试题总结
- 单链表面试题集合
- 单链表面试题汇总
- 单链表面试题汇总
- 【C++】单链表面试题
- 行编辑程序
- 【Java并发编程】之八:多线程环境中安全使用集合API(含代码)
- IntelliJ IDEA常用快捷键
- C#基础
- apk签名相关
- 单链表面试题--复杂链表的复制
- Wifi
- DragEnter、DragOver、DragDrop、leave、回车实现、事件的简单使用
- redis结合ssm框架中的使用,以AOP原理做一个redis缓存管理
- Python 用hashlib求中文字符串的MD5值
- thread46
- spring中ClassPathXmlApplicationContext和FileSystemXmlApplicationContext的区别
- K-S正态检验
- 比较ADO与ODBC的区别