26 - 复杂链表的复制
来源:互联网 发布:mysql if then else 编辑:程序博客网 时间:2024/05/29 03:45
题目描述:http://ac.jobdu.com/problem.php?pid=1524
输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点)。
注:以下解析来自程序员面试题精选100题(49)-复杂链表的复制[算法]精简。
第一步,为原始链表的每个节点N创建对应的节点N’,并把N’插入到N的后面
第二步,设置复制出来的节点的sibling, N’的sibling指向N的sibling的next
第三步,拆分链表,奇数个节点组成原始链表,偶数个节点组成复制出的链表
// 复制节点void CloneNodes(ComplexListNode* pHead) { ComplexListNode* pNode = pHead; while (pNode != NULL) { ComplexListNode* pCloneNode = new ComplexListNode(pNode->m_nValue); pCloneNode->m_pNext = pNode->m_pNext; pCloneNode->m_pSibling = NULL; pNode->m_pNext = pCloneNode; pNode = pCloneNode->m_pNext; //指向下一个节点 }}// 设置siblingvoid ConnectSibling(ComplexListNode* pHead) { ComplexListNode* pNode = pHead; while (pNode != NULL) { if (pNode->m_pSibling) pNode->m_pNext->m_pSibling = pNode->m_pSibling->m_pNext; pNode = pNode->m_pNext->m_pNext; }}// 拆分ComplexListNode* DetachList(ComplexListNode* pHead){ if (pHead == NULL) { return NULL; } ComplexListNode* pCloneHead = pHead->m_pNext; ComplexListNode* pCloneNode = pCloneHead; ComplexListNode* pNode = pHead; pNode->m_pNext = pCloneNode->m_pNext; pNode = pNode->m_pNext; // pNode先走一步,容易判断是否到链表尾 while (pNode) { pCloneNode->m_pNext = pNode->m_pNext; pCloneNode = pCloneNode->m_pNext; pNode->m_pNext = pCloneNode->m_pNext; pNode = pNode->m_pNext; } return pCloneHead;}// 三步组合,时间复杂度O(n),空间复杂度O(n)但没有使用额外的空间ComplexListNode* Clone(ComplexListNode* pHead) { CloneNodes(pHead); ConnectSibling(pHead); return DetachList(pHead);}
0 0
- 26 - 复杂链表的复制
- 面试26复杂链表的复制
- 26 复杂链表的复制
- 26-复杂链表的复制
- 剑26-复杂链表的复制
- 复杂链表的复制
- 复杂链表的复制
- 复杂链表的复制
- 复杂链表的复制
- 复杂链表的复制
- 复杂链表的复制
- 复杂链表的复制
- 复杂链表的复制
- 复杂链表的复制
- 复杂链表的复制
- 复杂链表的复制
- 复杂链表的复制
- 复杂链表的复制
- nginx设计解读--模块化设计及程序初始化
- GTK简单版计算器
- TextView 支持自定义字体和属性
- Struts2与servlet共存的解决方案
- SQLite 运算符
- 26 - 复杂链表的复制
- 【Android】在不同的线程池中执行AsyncTask
- Jsp中图片显示问题以及显示绝对路径图片问题
- vs2010运行mat文件的一个测试代码
- USACO 4.2.2The Perfect Stall 完美的牛栏(二分图最大匹配)
- linux下安装tomcat并设置开机自启动
- Android中获取应用程序(包)的信息-----PackageManager的使用(一)
- 公告栏无间隙滚动
- listview根据touch的坐票来确定获取点击的item view