我有一个非常简单的问题,我无法理解我应该如何进一步行动。
我有一个双向链表,其中第一个节点是空对象,最后一个节点是空对象。
我想在第一个节点和最后一个节点之间插入一个各种字符串元素。例如 - 我有字符串元素“C”,“D”,“A”,“P”。
插入双重链表后。我需要一些这样的插入顺序 -
FirstNullObject P D C LastNullObject
所以我不确定如何将null对象与我想要比较的各种字符串进行比较并继续添加。假设我首先添加C然后以某种方式我必须在这两个null对象之间插入C.然后,如果我要添加D,那么我必须将D与C进行比较,然后列表应该像这样 -
FirstNullObject D C LastNullObject
这里newLink是新的节点,如C,D和firstNode是null对象。但这不起作用。我总是得到例外。
if (newLink.data.compareToIgnoreCase(list.firstNode.data) > 0) {
//logic
}
我希望问题很清楚
答案 0 :(得分:3)
你从未问过一个问题,所以不,问题不明确。
可能是“我如何确定对象是否为空?”答案:
o == null
可能是,“我怎么能确定我在链表的末尾?”答案:当下一个节点为空时,你有最后一个节点。
可能是,“我如何在链表中表示终端节点?”答案:它与任何节点相同,但是引用列表中下一个节点的字段为空。
它可能是,“我怎么能有一个既可以是列表节点也可以是null的字段?我需要一些神奇的NodeONull,还是......?”答案:该字段只有您的节点类型,您只需将其指定为null。阅读section 4.1
它可能是,“我怎么能有一个字段既可以是列表的字符串成员,又有时会有一些特殊值作为列表的标记?”答案:呃,什么?节点的“值”字段与列表的结构完全没有关系。你问这个问题表明你已经在旷野中使用你的代码,并且应该参考你的课程资料,了解你究竟要处理什么。
我知道你谈到的是双向链表;这些答案都没有改变。是的,我认为上述任何一个都可能是您正在寻找的答案。
编辑:
是的,你出去了旷野。和firstNode是空对象
除了技术上,您的哨兵不是节点。
您的哨兵没有您感兴趣的.data字段。
你实际上在这里做的事情 - 或者当你得到错误时一半做 - 正在尝试在列表中使用特殊的“第一个”和“最后一个”和“中间”节点。三种不同的节点,也许您还想到了一个“空列表”对象。由于这是愚蠢的,可能你只是因为你不明白你要做什么而这样做。
你要做的更像是
class Cons {
public String data;
public Cons prev;
public Cons next;
Cons(String data, Cons prev, Cons next) { ... }
}
空列表:null
一个成员列表:新Cons(“a”,null,null);
三人名单:
Cons list = new Cons("a", null, null);
list.next = new Cons("b", list, null);
list.next.next = new Cons("c", list.next, null);
当您从链接列表移动到双向链接列表时没有太大变化,当您从Java提供的特殊子类型Cons(即null
)转移到您自己的子类型时,没有太大变化
答案 1 :(得分:1)
如果您已正确实现Null对象模式,那么而不是像
那样if (newLink.data.compareToIgnoreCase(list.firstNode.data) > 0) {
//logic
}
您应该执行类似
的操作if (newLink.equals(list.firstNode)) {
//logic
}
提供适当地覆盖equals和hashcode。
答案 2 :(得分:1)
Null对象应该是对象,而不是null
(对于Java) - 这是模式的主要意图。您需要拥有一些基本上“什么都不做”的数据类的子类(请参阅this article,C ++或C#示例可以很好地为您提供有关Java应该做什么的线索)并且不代表任何有效您域中类型的对象。
答案 3 :(得分:0)
您无法将null与Object进行比较,因为null不是对象。见Is null an Object?。为什么你还想要这些“NullObjects”?