以下是一个示例的Java代码,用于深拷贝一个CirDoublyList对象,并使用main函数进行验证:
public class CirDoublyList<T> implements Cloneable {
private Node<T> head;
// 节点类
private static class Node<T> {
T data;
Node<T> prev;
Node<T> next;
public Node(T data) {
this.data = data;
}
}
// 构造函数
public CirDoublyList() {
head = new Node<>(null);
head.prev = head;
head.next = head;
}
// 添加元素到链表尾部
public void add(T element) {
Node<T> newNode = new Node<>(element);
newNode.next = head;
newNode.prev = head.prev;
head.prev.next = newNode;
head.prev = newNode;
}
// 深拷贝方法
@Override
public CirDoublyList<T> clone() throws CloneNotSupportedException {
CirDoublyList<T> newList = (CirDoublyList<T>) super.clone();
if (head == null || head.next == null) {
return newList; // 空链表直接返回新链表对象
}
Node<T> p, q, r;
p= newList.head;
r= newList.head.prev;//r指向新链表的最后一个节点
for(q=head.next;q!=head;q=q.next)//扫描原链表中每个节点
{
p=new Node<>(q.data);//复制当前节点
r.next=p;//将新节点p插入到r与p之间
p.prev=r;
r=p; //r指向新链表的最后一个节点
}
p.next=newList.head;//将尾结点的next引用指向head
newList.head.prev=p;//head的prev引用指向尾结点
return newList;
}
public static void main(String[] args) {
// 创建原始链表对象
CirDoublyList<String> originalList = new CirDoublyList<>();
originalList.add("A");
originalList.add("B");
originalList.add("C");
try {
// 深拷贝链表对象
CirDoublyList<String> copiedList = originalList.clone();
// 验证深拷贝是否成功
System.out.println("Original List:");
printLinkedList(originalList);
System.out.println("\nCopied List:");
printLinkedList(copiedList);
// 修改原始链表,观察是否对深拷贝对象产生影响
originalList.add("D");
System.out.println("\nOriginal List after modification:");
printLinkedList(originalList);
System.out.println("\nCopied List after modification:");
printLinkedList(copiedList);
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
}
private static void printLinkedList(CirDoublyList<?> list) {
Node<?> current = list.head.next;
while (current != list.head) {
System.out.print(current.data + " ");
current = current.next;
}
}
}
这段代码定义了一个CirDoublyList类,包含了一个Node内部类作为节点,并实现了深拷贝的clone方法。在main函数中,创建了一个原始链表对象originalList,并通过clone方法进行深拷贝得到copiedList。验证部分打印了原始链表和深拷贝链表的内容,并在修改原始链表后再次打印两个链表,观察是否对深拷贝对象产生影响。
希望以上代码能满足你的需求,如有需要请随时提问。
内容由零声教学AI助手提供,问题来源于学员提问




