好的,下面是一个使用CirDoublyList实现深拷贝的示例代码(Java):
public class CirDoublyList<T> {
private Node<T> head;
// 内部节点类
private static class Node<T> {
T data;
Node<T> prev;
Node<T> next;
public Node(T data) {
this.data = data;
this.prev = null;
this.next = null;
}
}
// 构造函数
public CirDoublyList(CirDoublyList<T> list) {
if (list.head == null) {
this.head = null; // 如果原链表为空,则新链表也为空
} else {
// 复制头结点,并将新链表的头指针指向该节点
this.head = new Node<>(list.head.data);
Node<T> currentNode = list.head.next; // 当前遍历到的节点
while (currentNode != list.head) { // 遍历原链表直到回到头结点
insertAtEnd(currentNode.data); // 将当前节点数据插入新链表尾部
currentNode = currentNode.next; // 继续遍历下一个节点
}
}
}
// 在链表末尾插入元素
public void insertAtEnd(T data) {
Node<T> newNode = new Node<>(data);
if (head == null) { // 空链表情况下,将头结点设置为新节点并形成循环
head = newNode;
head.prev = head;
head.next = head;
} else { // 非空链表情况下,在尾部插入新节点
Node<T> lastNode = head.prev;
newNode.prev = lastNode;
newNode.next = head;
lastNode.next = newNode;
head.prev = newNode;
}
}
// 打印链表元素
public void printList() {
if (head == null) {
System.out.println("Empty list");
return;
}
Node<T> currentNode = head;
do {
System.out.print(currentNode.data + " ");
currentNode = currentNode.next;
} while (currentNode != head);
System.out.println();
}
// 主函数用于验证
public static void main(String[] args) {
CirDoublyList<Integer> originalList = new CirDoublyList<>();
originalList.insertAtEnd(1);
originalList.insertAtEnd(2);
originalList.insertAtEnd(3);
System.out.print("Original list: ");
originalList.printList();
CirDoublyList<Integer> copiedList = new CirDoublyList<>(originalList);
System.out.print("Copied list: ");
copiedList.printList();
}
}
上述代码中,我们使用CirDoublyLis
t类实现了一个循环双向链表,并通过CirDoublyLis
t的构造函数实现了深拷贝功能。在主函数中,我们创建了一个原始的循环双向链表originalList
,然后使用构造函数创建了一个深拷贝的副本copiedLis
t,并打印验证两个链表是否相同。
内容由零声教学AI助手提供,问题来源于学员提问