ZBLOG

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

以下是使用Java编写的示例代码,演示了如何实现深拷贝一个循环双向链表(CirDoublyList):

  1. class Node<T> {
  2. T data;
  3. Node<T> prev;
  4. Node<T> next;
  5. public Node(T data) {
  6. this.data = data;
  7. }
  8. }
  9. class CirDoublyList<T> {
  10. private Node<T> head;
  11. private int size;
  12. public CirDoublyList() {
  13. head = null;
  14. size = 0;
  15. }
  16. public void add(T element) {
  17. Node<T> newNode = new Node<>(element);
  18. if (head == null) {
  19. newNode.prev = newNode;
  20. newNode.next = newNode;
  21. head = newNode;
  22. } else {
  23. newNode.next = head;
  24. newNode.prev = head.prev;
  25. head.prev.next = newNode;
  26. head.prev = newNode;
  27. }
  28. size++;
  29. }
  30. public void display() {
  31. if (head == null) return;
  32. Node<T> current = head;
  33. do {
  34. System.out.print(current.data + " ");
  35. current = current.next;
  36. } while (current != head);
  37. System.out.println();
  38. }
  39. public CirDoublyList(CirDoublyList<T> list) {
  40. if (list.head == null) return;
  41. Node<T> currentOriginal = list.head;
  42. // 创建新的头节点
  43. this.head = new Node<>(currentOriginal.data);
  44. // 使用哈希表来保存原链表节点和新链表节点之间的对应关系,以便在后续步骤中进行连接操作
  45. HashMap<Node<T>, Node<T>> nodeMap= new HashMap<>();
  46. nodeMap.put(currentOriginal, head);
  47. Node<T> currentCopy = head;
  48. // 复制原链表中的节点,并建立新链表
  49. while (currentOriginal.next != list.head) {
  50. currentOriginal = currentOriginal.next;
  51. Node<T> newNode = new Node<>(currentOriginal.data);
  52. nodeMap.put(currentOriginal, newNode);
  53. currentCopy.next = newNode;
  54. newNode.prev = currentCopy;
  55. currentCopy = newNode;
  56. }
  57. // 连接新链表的头尾节点
  58. currentCopy.next = head;
  59. head.prev = currentCopy;
  60. // 根据哈希表恢复其他连接关系
  61. for (Node<T> original : list.nodeMap.keySet()) {
  62. Node<T> copy = list.nodeMap.get(original);
  63. copy.prev = list.nodeMap.get(original.prev);
  64. copy.next= list.nodeMap.get(original.next);
  65. }
  66. this.size = list.size;
  67. }
  68. }
  69. public class Main {
  70. public static void main(String[] args) {
  71. CirDoublyList<Integer> originalList = new CirDoublyList<>();
  72. originalList.add(1);
  73. originalList.add(2);
  74. originalList.add(3);
  75. System.out.println("原始链表:");
  76. originalList.display();
  77. CirDoublyList<Integer> copiedList = new CirDoublyList<>(originalList);
  78. System.out.println("复制后的链表:");
  79. copiedList.display();
  80. }
  81. }

以上代码演示了一个循环双向链表(CirDoublyList)的实现,其中包括添加元素、展示列表和深拷贝等功能。在 main 函数中,我们创建了一个原始链表,然后通过调用深拷贝构造函数创建了一个新的链表,并展示了两个链表的内容。


内容由零声教学AI助手提供,问题来源于学员提问

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

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

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

联系我们

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

微信号:3007537140

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

关注我们
x

注册

已经有帐号?