1

我有一个通用的有序链表类。出于某种原因,每次运行 add() 时都会重新分配 LinearNode 头。有任何想法吗?为什么每次运行时都会改变头部?我什至没有碰它。如果需要,我可以提供其他类进行测试。

 public class myOrLiList<T extends Comparable<T>> {

public LinearNode head;
public int count;

public myOrLiList() {
    head = null;
    count = 0;

}

// LinearNode INNER CLASS
public class LinearNode {
    public LinearNode next;
    public T item;

    public LinearNode(T thisitem) {
        this.next = null;
        this.item = thisitem;
    }

}
public boolean isEmpty() {
    return (head == null);
}
public void add(T thisItem) {

    LinearNode newNode = new LinearNode(thisItem);

    if (isEmpty()) {
        head = newNode;
        System.out.println("head filled!");
    } else {
        LinearNode compareNode = head;
        do {
            if (thisItem.compareTo(compareNode.item) < 0) {
                newNode.next = compareNode;
                break;
            } else if ((thisItem.compareTo(compareNode.item) < 0)
                    || (thisItem.compareTo(compareNode.item) == 0)) {
                newNode.next = compareNode.next;
                compareNode.next = newNode;
                break;
            } else {
                compareNode = compareNode.next;
            }
        } while (compareNode.next != null);
    }
    System.out.println("Added!");
    count++;
}

谢谢你的帮助。

4

2 回答 2

1

head改变的原因是因为这条线:

compareNode = compareNode.next;

之前你这样做了:

LinearNode compareNode = head;

您实际上是在说这compareNode是您的主要对象。您正在将指向 head 的 Object 引用设置为也指向compareNode. 您采取的任何行动都会以完全相同的方式compareNode产生影响。head

因为你设置 compareNode = head,这两行对同一个对象引用做同样的事情:

compareNode.next = null;
head.next = null;

我看到其他一些事情是错误的。我会尝试一一检查。

您何时为空的逻辑LinkedList似乎是正确的......

然而,

如果您在列表大小为 1 时添加第二个节点,您将遇到一些问题...

if (thisItem.compareTo(compareNode.item) < 0)你调用这段代码然后爆发:

newNode.next = compareNode;
break;

在那之后你在用 newNode 做什么?答案是什么。由于您没有更新head,因此没有任何变化。你创建了一个LinearNode,设置它的next值等于head,然后让它死掉。

我认为您想要做的是获取对存储在的旧节点的引用head,保存它,然后将您的head变量设置为等于您的新节点。然后,您将设置 newNode.next(newNode现在在哪里head)等于您保存的 OLD 头节点。所以你会有这样的东西:

LinearNode oldHead = head;
head = newNode;
head.next = oldHead;

现在进行下一部分。你有一个

if ((thisItem.compareTo(compareNode.item) < 0) || (thisItem.compareTo(compareNode.item) == 0))

你已经介绍了 where 的情况compareNode.item < 0,那你为什么还要检查呢?它不会弄乱你的逻辑,但它是多余的。

本质上,您要做的是将 newNode 放在当前节点之前(如果它比较为 < 0),将您的 newNode 放在当前节点之后(如果它比较为 > 0),如果 currentElement 结束则替换或不执行任何操作向上 == 0。

我已经介绍了 < 0 的情况,因此您应该尝试弄清楚如何处理大于和等于的情况。

于 2012-10-24T22:17:06.520 回答
1

虽然这门课有一些错误(谢谢你的提示,迈克尔!)我问的问题不是来自这些错误。

在我为 T 创建的新对象类中,我声明了静态属性。因此,每次创建一个新的 T thisItem 时,所有对象的所有属性都会被更改。

于 2012-10-25T14:16:24.570 回答