这是一个双向链表的Java实现。让我逐句解释一下代码。
public class DoublyList<T> {
public DoubleNode<T> head;
public DoublyList() {
this.head = new DoubleNode<T>();
this.head.prev = null;
this.head.next = null;
}
在这段代码中,首先定义了一个DoublyList类和一个head成员变量,它是指向双向链表头结点的引用。构造函数初始化了链表,并将头结点的前驱和后继都设置为null。
public boolean isEmpty() {
return this.head.next == null;
}
这个方法判断链表是否为空,通过检查头结点的后继指针是否为null来判断。
public String toString() {
String str = this.getClass().getName() + "(";
DoubleNode<T> p = this.head.next;
while (p != null) {
str += p.data.toString() + ((p.next != null) ? "," : "");
p = p.next;
}
return str + ")";
}
toString()方法用于返回当前链表的字符串表示。它遍历整个链表,将每个节点的数据转换为字符串并拼接起来。
public DoubleNode<T> insert(int i, T x) {
if (x == null)
return null;
DoubleNode<T> front = this.head;
for (int j=0; front.next != null && j<i; j++)
front = front.next;
DoubleNode<T> q = new DoubleNode<T>(x, front, front.next);
front.next.prev = q;
front.next = q;
return q;
}
insert(int i, T x)方法在链表的第i个位置插入一个新节点。如果插入位置为null或者x为null,则返回null。通过遍历找到第i个位置的节点前驱front,然后创建一个新的节点q,并将其插入到front和front的后继之间。
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;
}
insert(T x)方法在链表末尾添加一个新节点,如果要插入的数据为null,则返回null。它先遍历到链表末尾,然后创建一个新的节点q并插入到末尾。
public DoublyList(DoublyList<T> list) {
this();
DoubleNode<T> rear = this.head;
for(DoubleNode<T> p = list.head.next; p != null; p = p.next) {
DoubleNode<T> q = new DoubleNode(p.data, rear, null);
rear.next = q;
q.prev = rear;
rear = rear.next;
}
}
这是一个复制构造函数,可以根据另一个双向链表对象创建一个新的链表对象。它首先调用默认构造函数创建一个新链表,然后遍历原链表中的每个节点,将节点数据复制到新链表中。
public void concat(DoublyList<T> list) {
DoubleNode<T> rear = this.head;
while (rear.next != null) {
rear = rear.next;
}
rear.next = list.head.next;
if (list.head.next != null) {
list.head.next.prev = rear;
}
}
concat(DoublyList<T> list)方法将另一个双向链表对象连接到当前链表的末尾。它首先找到当前链表的最后一个节点,然后将其后继指针指向另一个链表的头结点。如果另一个链表不为空,则更新另一个链表头结点的前驱指针。
public void addAll(DoublyList<T> list) {
this.concat(new DoublyList<T>(list));
}
addAll(DoublyList<T> list)方法是在当前链表的末尾添加另一个链表的所有节点。它通过调用concat()方法来实现。
public DoublyList<T> union(DoublyList<T> list) {
DoublyList<T> result = new DoublyList<>(this);
result.addAll(list);
return result;
}
union(DoublyList<T> list)方法返回当前链表和另一个链表的并集。它首先创建一个新的链表对象作为结果,然后将当前链表和另一个链表都添加到结果中。
最后,在main()方法中演示了如何使用这个双向链表的代码。首先创建两个链表对象list1和list2,分别插入1到5和6到10的数据。然后打印输出两个链表的内容。接下来调用addAll()方法将list2添加到list1中,并打印输出合并后的链表内容。
关于链表变化的图,由于文字无法直接表示图形,可以参考以下链接查看链表的变化图:
https://imgur.com/8v3tCdm
内容由零声教学AI助手提供,问题来源于学员提问




