剑指Offer面试题26(Java版):复杂链表的复制
来源:互联网 发布:悠悠社区网络 编辑:程序博客网 时间:2024/05/06 20:57
题目描述:
复制一个复杂链表,在复杂链表中,每个结点除了有一个next指针指向下一个结点外,还有一个sbiling指向链表中的任意结点或者null。
下图是一个复杂链表的示例,Null的指针没有画出。
解题思路:
1.很直观的解法就是分成两步:
1).复制原始链表上的每一个结点,并用next指针连起来。
2).复制sbiling指针。
但是复制sbiling指针时需要比较高的复杂度。
以上图为例,如果我们要复制B对应B’的的sbiling指针,那就是要找到E’,想要找到E’只能根据
B到E要走的步数 = B’到E’要走的步数
然而又如D.sbiling = B,指向的结点在它的前面,而链表并没有指向前一个元素的指针,所以,每次都只能根据从链表头结点到目标的结点的步数来找到sbiling应该指向的元素。
这种方法显然效率太低,时间复杂度达到了O(n*n)。
2.书中提到了利用哈希表存储(N, N’)的配对信息的方法
这是一个在时间上很高效的方法,在查找上,利用哈希表的高效性。但是缺点在于要用额外的空间。
3.更为高效的一种不利用辅助空间的方法
这个方法的巧妙之处在于利用链表结点本身记录sbiling指针的位置。
分成三个步骤
1).根据原始链表的每个结点N创建对应的N’,并把N’连在N的后面。
如下图:
2)看到上图我们就应该知道这个算法的巧妙之处了,B’.sbiling就记录在B.sbiling.next,这一步就是通过这个方法设置sbiling指针了。
3).将两个链表断开。
public class CopyComplexListTest { static class Node{ int value; Node next; Node sbiling; @Override public String toString() { StringBuilder sb = new StringBuilder(); sb.append("value = " + value); sb.append(", next = " + (next == null ? "null" : next.value)); sb.append(", sbiling = " + (sbiling == null ? "null" : sbiling.value)); return sb.toString(); } } public static void copyList(Node head){ Node node = head; while(node != null){ Node copyNode = new Node(); copyNode.value = node.value; copyNode.next = node.next; copyNode.sbiling = null; node.next = copyNode; node = copyNode.next; } } public static void setSbiling(Node head){ Node node = head; while(node != null){ Node copyNode = node.next; if(node.sbiling != null){ copyNode.sbiling = node.sbiling.next; } node = copyNode.next; } } public static Node disConnectList(Node head){ Node node = head; Node copyHead = null; Node copyNode = null; if(node != null){ copyHead = node.next; copyNode = node.next; node.next = copyNode.next; node = node.next; } while(node != null){ copyNode.next = node.next; copyNode = copyNode.next; node.next = copyNode.next; node = node.next; } return copyHead; } public static Node copy(Node head){ copyList(head); setSbiling(head); return disConnectList(head); } public static void main(String[] args) { Node head = new Node(); head.value = 1; Node node2 = new Node(); node2.value = 2; Node node3 = new Node(); node3.value = 3; Node node4 = new Node(); node4.value = 4; Node node5 = new Node(); node5.value = 5; head.next = node2; head.sbiling = node3; node2.next = node3; node2.sbiling = node5; node3.next = node4; node4.next = node5; node4.sbiling = node2; Node copyHead = copy(head); Node node = copyHead; while(node != null){ System.out.println(node); node = node.next; } }}
0 0
- 剑指Offer面试题26(Java版):复杂链表的复制
- [剑指offer][面试题26]复杂链表的复制
- 剑指offer 面试题26复杂链表的复制
- 【剑指offer】面试题26:复杂链表的复制
- 剑指Offer:面试题26 复杂链表的复制
- 《剑指Offer》面试题26:复杂链表的复制
- 剑指offer面试题26-复杂链表的复制
- 剑指offer-面试题26:复杂链表的复制
- 剑指Offer----面试题26:复杂链表的复制
- 剑指offer 面试题26 复杂链表的复制
- 剑指offer面试题26:复杂链表的复制
- 剑指offer--面试题26:复杂链表的复制
- 剑指Offer---面试题26:复杂链表的复制
- 剑指offer-面试题26-复杂链表的复制
- 剑指offer-面试题26 复杂链表的复制
- 【面试题】剑指Offer-26-复杂链表的复制
- 剑指offer-面试题26-复杂链表的复制
- 剑指offer 面试题26 复杂链表的复制
- (Java)LeetCode-59. Spiral Matrix II
- 各个浏览器内核总结
- 一个技术人员35岁之前要做的10件事
- 前端面试题汇总(三)
- Java 的运算符
- 剑指Offer面试题26(Java版):复杂链表的复制
- 小议JQuery中focus()和focusin()区别
- Java语言之抽象类
- C/C++ Notes: C++的*和&
- 第58篇USB获取数据 及PHP研究
- 8086指针寄存器
- fragment与activity间的通信(一)
- Android笔记二十四.Android基于回调的事件处理机制
- 为IT程序员量身定制的12个目标——很经典