以下是修改后的代码,实现了在循环双链表类中添加addAll、concat和union方法,以实现两个链表的集合并:
public class DoublyList<T> {
public DoubleNode<T> head;
public DoublyList() {
this.head = new DoubleNode<T>();
this.head.prev = null;
this.head.next = null;
}
public String toString() {
String str = this.getClass().getName() + "(";
for (DoubleNode<T> p = this.head.next; p != null; p = p.next)
str += p.data.toString() + ((p.next != null) ? "," : "");
return str + ")";
}
public DoubleNode<T> insert(T x) {
if (x == null)
return null;
DoubleNode<T> rear = head;
while (rear.next != null) {
rear = rear.next;
}
DoubleNode<T> q = new DoubleNode<T>(x, rear, null);
rear.next = q;
return q;
}
public void concat(DoublyList<T> list) {
DoubleNode<T> rear1 = this.head;
while (rear1.next != null)
rear1 = rear1.next;
DoubleNode<T> rear2 = list.head.next;
if(rear2 == null) // 空链表直接返回
return;
// 将list的第一个节点连接到this链表末尾
rear1.next=rear2;
rear2.prev=rear1;
// 找到list链表末尾节点
while (rear2.next!=null){
rear2=rear2.next;
// 恢复尾节点的prev为rear1
rear2.prev=rear1;
}
}
public void addAll(DoublyList<T> list) {
concat(list);
}
public DoublyList<T> union(DoublyList<T> list) {
DoublyList<T> result = new DoublyList<T>(this);
result.addAll(list);
return result;
}
public static void main(String[] args) {
DoublyList<Integer> list1 = new DoublyList<Integer>();
DoublyList<Integer> list2 = new DoublyList<Integer>();
for (int i = 1; i <= 5; i++)
list1.insert(i);
for (int i = 6; i <= 10; i++)
list2.insert(i);
System.out.println(list1.toString());
System.out.println(list2.toString());
list1.addAll(list2);
System.out.println(list1.toString());
}
}
在修改后的代码中,concat方法实现了将一个链表连接到当前链表的末尾,addAll方法则是对concat进行了简单封装,使得可以直接将一个链表添加到当前链表中。而union方法利用之前实现的addAll方法,返回了两个链表的集合并结果。
在主函数中,创建两个循环双链表对象list1和list2,并分别插入元素。然后调用addAll方法将list2添加到list1中,并输出最终结果。
注意:需要提前定义好DoubleNode类来支持DoublyList类的操作。
内容由零声教学AI助手提供,问题来源于学员提问




