编写克隆的编程题目时,可以考虑以下几个方面来确保题目的清晰性和完整性:
明确克隆类型
浅克隆:只复制对象的基本属性,而引用类型的属性仍然指向同一个对象。
深克隆:不仅复制对象的基本属性,还递归地复制对象引用的所有对象,直到这个对象图中的所有对象都被复制过来。
题目描述
清晰地描述题目要求,包括需要克隆的对象类型(如对象、链表、二叉树等)以及是否需要支持链表中的随机指针或二叉树的结构。
指出是否需要考虑克隆后的对象与原对象在内存中的地址不同,但值相同。
示例和边界情况
提供一些示例来说明题目要求,包括正常情况和边界情况。
例如,对于链表,可以给出一个含有随机指针的链表,要求实现深拷贝。
对于二叉树,可以给出一个复杂的二叉树结构,要求实现深拷贝。
实现要求
明确实现克隆的方法,如通过实现`Cloneable`接口并重写`clone()`方法,或者通过序列化和反序列化实现。
如果需要考虑性能,可以指出深克隆通常比浅克隆更复杂且耗时。
测试用例
提供一些测试用例来验证克隆函数的正确性,包括正常情况、边界情况和异常情况。
例如,可以测试克隆一个空对象、克隆一个包含循环引用的对象、克隆一个大型数据结构等。
附加要求
如果题目要求实现对象池或克隆模式,需要明确这些高级功能的具体要求和实现方式。
可以要求实现额外的功能,如克隆检测、克隆分析或克隆生成。
---
题目描述:
给定一个含有随机指针的链表,编写一个函数来对该链表进行深拷贝。要求复制后的链表与原链表的节点值相同,但节点地址不同,并且随机指针也指向新的节点。
输入:
一个链表,其中每个节点包含一个整数值和一个指向下一个节点的指针,部分节点还包含一个指向链表中任意节点的随机指针。
输出:
一个深拷贝后的新链表,包含与原链表相同的值和结构,但节点地址和随机指针均不同。
示例:
```python
class Node:
def __init__(self, val=0, next=None, random=None):
self.val = val
self.next = next
self.random = random
创建一个链表 1 -> 2 -> 3 -> 4
head = Node(1)
head.next = Node(2)
head.next.next = Node(3)
head.next.next.next = Node(4)
设置随机指针
head.next.random = head.next.next
head.next.next.next.random = head.next
深拷贝链表
def copyRandomList(head: Node) -> Node:
if not head:
return None
第一步:复制每个节点,并将复制的节点插入到原节点的后面
cur = head
while cur:
copy_node = Node(cur.val, cur.next, None)
cur.next = copy_node
cur = copy_node.next
第二步:设置复制节点的随机指针
cur = head
while cur:
if cur.random:
cur.next.random = cur.random.next
cur = cur.next.next
第三步:拆分两个链表
copy_head = head.next
cur = head
while cur:
copy_node = cur.next
cur.next = copy_node.next
if copy_node.next:
copy_node.next = copy_node.next.next
cur = cur.next
return copy_head
```
测试用例: