【剑指offer-Java版】26复杂链表的复制
2016-04-26 11:29
651 查看
复杂链表复制:
一种思路是通过哈希表存放sibling的配对信息 – 没看明白
一种思路是直接在原始链表中复制,然后拆分 – 属于时间和空间效率都比较高的方式
分三步,还是比较好懂的
测试代码:
一种思路是通过哈希表存放sibling的配对信息 – 没看明白
一种思路是直接在原始链表中复制,然后拆分 – 属于时间和空间效率都比较高的方式
分三步,还是比较好懂的
public class _Q26<T> { public ComplexListNode<T> Clone(ComplexListNode<T> list){ if(list == null) return null; CloneNodes(list); ConnectSibling(list); return ReconnectedNodes(list); } private void CloneNodes(ComplexListNode<T> list){ ComplexListNode<T> nextNode = list; while(nextNode != null){ ComplexListNode<T> node = new ComplexListNode<>(); node.value = nextNode.value; node.next = nextNode.next; nextNode.next = node; nextNode = nextNode.next.next; // 复制之后也是需要 一次走两步的 } } private void ConnectSibling(ComplexListNode<T> list){ ComplexListNode<T> nextNode = list; while(nextNode != null){ if(nextNode.sibling != null){ nextNode.next.sibling = nextNode.sibling.next; } nextNode = nextNode.next.next; // 一次跨两步 } } private ComplexListNode<T> ReconnectedNodes(ComplexListNode<T> list){ ComplexListNode<T> result = list.next; ComplexListNode<T> node1 = list; ComplexListNode<T> node2 = result; while(node2 != null){ if(node2.next == null){ node1.next = null; }else{ node1.next = node2.next; node2.next = node2.next.next; } node1 = node1.next; node2 = node2.next; } return result; } }
测试代码:
public class _Q26Test extends TestCase { _Q26 cloneComplexList = new _Q26(); public void test(){ ComplexListNode<Character> list = new ComplexListNode<>(); ComplexListNode<Character> node1 = new ComplexListNode<>(); ComplexListNode<Character> node2 = new ComplexListNode<>(); ComplexListNode<Character> node3 = new ComplexListNode<>(); ComplexListNode<Character> node4 = new ComplexListNode<>(); list.value = 'A'; node1.value = 'B'; node2.value = 'C'; node3.value = 'D'; node4.value = 'E'; list.next = node1; node1.next = node2; node2.next = node3; node3.next = node4; node4.next = null; list.sibling = node2; node1.sibling = node4; node3.sibling = node1; System.out.println("===================================before"); ComplexListNode<Character> node = list; while(node != null){ System.out.println(node.value + " - " + (node.sibling == null ? "" : node.sibling.value)); node = node.next; } ComplexListNode<Character> result = cloneComplexList.Clone(list); System.out.println("===================================after"); ComplexListNode<Character> nodeX = result; while(nodeX != null){ System.out.println(nodeX.value + " - " + (nodeX.sibling == null ? "" : nodeX.sibling.value)); nodeX = nodeX.next; } } }
相关文章推荐
- 【剑指offer-Java版】25二叉树中和为某一值的路径
- 【剑指offer-Java版】24二叉搜索树后序遍历序列
- 最详细的JavaScript和事件解读
- 【剑指offer-Java版】23从上往下打印二叉树
- \0 导致JSON无法解析的问题
- 【剑指offer-Java版】22栈的压入弹出序列
- js刷新页面方法大全
- js对字符串的处理--查找,合并,截取
- Extjs4中up()和down()的用法
- 【剑指offer-Java版】21包含min函数的栈
- ExtJs xtype一览
- jQuery与JavaScript入门经典——AJAX
- JSTL标签库大全
- Chrome 调试动态Javascript
- JSTL标签用法 详解
- 几种常用JQuery插件介绍
- Caffe学习系列(3):视觉层(Vision Layers)及参数
- 利用HTML5的canvas制作万花筒动画特效
- JSP EL表达式详细介绍
- css文字环绕图片--遇到的问题及解决方法