在你提供的代码中,存在一些问题:
在
CirSinglyList类的构造函数中,没有正确初始化头结点head。应该将其指向自身:this.head.next = this.head;。在
union方法中,变量temp应该从list.head.next开始遍历而不是list.head。在第一个 while 循环中,缺少对 front 和 p 的更新语句。可以添加
front = front.next; p = p.next;。在第二个 while 循环中,在找到相同数据项时,应将相应节点删除,并将 temp 指向下一个节点。可以更正为:
if (temp.next.data.equals(p.next.data)) { temp.next = temp.next.next; } else { temp = temp.next; }最后,在将链表连接起来时,缺少将尾节点指向头结点的步骤。可以添加
rear.next = this.head;。
修改后的代码如下所示:
package project;
public class CirSinglyList<T> {
public static void main(String[] args) {
Integer[] values1 = { 1, 2, 3, 4, 5 };
Integer[] values2 = { 5, 6, 7, 8, 9 };
CirSinglyList<Integer> list1 = new CirSinglyList<Integer>(values1);
CirSinglyList<Integer> list2 = new CirSinglyList<Integer>(values2);
CirSinglyList<Integer> list3 = list1.union(3, list2);
CirSinglyList<Integer> list4 = new CirSinglyList<Integer>(list3);
System.out.println(list3.toString());
System.out.println(list4.toString());
}
public Node<T> head;
public CirSinglyList() {
this.head = new Node<T>();
this.head.next = this.head;
}
public CirSinglyList(T[] values) {
this();
Node<T> rear = this.head;
for (int i = 0; i < values.length; i++) {
if (values[i] != null) {
rear.next = new Node<T>(values[i], null);
rear = rear.next;
}
}
}
public String toString() {
String str = this.getClass().getName() + "(";
for (Node<T> p = this.head.next; p != this.head; p = p.next) {
str += p.data.toString() + (p.next != this.head ? "," : "");
}
return str + ")";
}
public CirSinglyList(CirSinglyList<T> list) {
this();
Node<T> rear = this.head;
for (Node<T> p = list.head.next; p != list.head; p = p.next) {
rear.next = new Node<T>(p.data, null);
rear = rear.next;
}
rear.next=this.head;
}
public CirSinglyList<T> union(int i, CirSinglyList<T> list) {
Node<T> front=this.head;
Node<T> temp=list.head.next;
Node<T> p=this.head;
for(int j=0;j<i-1;j++)
front=front.next;
while(p.next!=this.head)
{
temp=list.head.next;
while(temp.next!=list.head)
{
if (temp.next.data.equals(p.next.data)) {
temp.next = temp.next.next;
} else {
temp = temp.next;
}
}
front=front.next;
p=p.next;
}
p.next=list.head.next;
return list;
}
public static class Node<T> {
T data; // 数据域
Node<T> next; // 地址域
public Node() {
this(null, null);
}
public Node(T data, Node<T> next) {
this.data = data;
this.next = next;
}
}
}
这样修改后,代码应该能够正常运行并输出所需结果。
内容由零声教学AI助手提供,问题来源于学员提问




