ZBLOG

CirDoublyList(CirDoublyList list) ,深拷贝list,用java写,加main函数验证

以下是一个示例的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助手提供,问题来源于学员提问

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://golang.0voice.com/?id=8149

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?