嗨,我正在努力让这两种方法发挥作用,但即使我尝试了几乎所有我能想到的方法,它仍然不起作用。请告诉我怎么修!
空添加(任何值):将一个包含newValue的节点添加到列表的末尾。
空添加(int index,任何值):在索引的节点之后添加一个包含newValue的节点(假设索引从0开始)。
下面是我的代码:(上面的方法显示在底部)
public class Node<Anything>
{
private Anything data;
private Node next;
Node(Anything a, Node<Anything> n)
{
data = a;
next = n;
}
public Anything getData()
{
return this.data;
}
public Anything setData(Anything newData)
{
Anything oldData = this.data;
this.data = newData;
return oldData;
}
public void setNext(Node<Anything> newNext)
{
this.next = newNext;
}
public Node<Anything> getNext()
{
return this.next;
}
}
------------------------------------------
public class CS2LinkedList<Anything>
{
private Node<Anything> first;
private Node<Anything> last;
public CS2LinkedList()
{
first = null;
}
public boolean isEmpty()
{
return (first == null);
}
public void addFirst(Anything d)
{
Node<Anything> temp = first;
first = new Node<>(d,temp);
}
public void clear()
{
first = null;
}
public boolean contains(Anything value)
{
for (Node curr = first; curr != null; curr = curr.getNext())
{
if (value.equals(curr.getData())){
return true;
}
}
return false;
}
public String toString()
{
StringBuilder result = new StringBuilder(); //String result = "";
for (Node curr = first; curr != null; curr = curr.getNext())
result.append(curr.getData() + "->"); //result = result + curr.data + "->";
result.append("[null]");
return result.toString(); //return result + "[null]";
}
public int size()
{
int size = 0;
for (Node curr = first; curr != null; curr = curr.getNext()){
size++;
if (first==null){
size = 0;
}
}
return size;
}
public Anything getFirst()
{
if (first!=null){
return first.getData();
}
else{
System.out.println("Sorry, the list is empty.");
return null;
}
}
public Anything getLast()
{
if (first!= null){
for(Node curr = first; curr != null; curr = curr.getNext()){
first = curr;
}
return first.getData();
//FIX: list2's size decreases by 1 after executing list2.getLast()
}
else{
System.out.println("Sorry, the list is empty.");
return null;
}
}
public void add(Anything value){
if (first==null){
first = new Node<>(value,first);
}
Node<Anything> next = new Node<>(value, first);
first.setNext(null);
last = next;
}
public void addAfter(int index, Anything value)
{
return;
}
}
有点长的回答,试着解释每一个问题并给出解决方案。有耐心!
你的代码正是按照你告诉它的去做,以相反的方式添加新节点。它将新节点
添加为第一个
,并将当前第一个
设置为新节点的下一个
,同时调用addFirst()
。
但是使用您提到的当前add()
方法,通过调用print toString()
方法,您总是会得到一个不超过one
元素的链表,尽管您的列表包含的节点不超过两个。让我们看看您的代码来理解这一点:
public void add(Anything value){
if (first==null){
first = new Node<>(value,first);
}
Node<Anything> next = new Node<>(value, first);
first.setNext(null);
last = next;
}
所以你要做的是,检查first
是否为null,这意味着,当前列表是否为空。如果true
,则用新值初始化first
(例如"x"
),然后将其作为当前第一,也就是null
。所以我们得到[first(x)]-
接下来,您将初始化一个
Next
节点,其中值和
first
作为下一个节点。然后将第一个
中的下一个设置为空
,并将下一个
分配给最后一个
。到目前为止,我们已经:
[next(x)] -> [first(x)] -> [null] //where last node is next(x)
现在,如果您想
的添加(y)
,另一个下一个
将被初始化为当前的第一个
,作为这个新节点的下一个。然后再次对第一个下一个
的null
进行冗余设置。再次将这个新节点分配给last
。现在我们有:
[next(y) -> [first(x)] -> [null]
好了,开始吧!如果你想添加相同的代码节点,那么你需要添加多少个新的代码节点。
因此,使用这个
add()
方法,您将始终获得两个元素的链接列表。
但是为什么toString()只给出了
[first(x)]-
好吧,看看toString()函数,它从
first
开始,一直运行到first.next==null
。而且,如果您使用此add()
方法添加节点,则总是有first.next==null
。因此,toString()
的这种行为。
解决方案是什么?
在初始化期间,将构造函数中链表的
之后添加第一个节点。首先移除第一个
和最后一个
都设置为空。在add()
方法中,使用值和
<代码>返回last
首次初始化first
。并将其分配给最后一个。setNext(null)
语句,用value和null
初始化新节点。将
当前最后一个
的下一个
设为新节点
。并将新节点指定为最后一个节点。以下是代码:
public void add(Anything value) {
if (first == null) {
first = new Node<>(value, last);
last = first;
return;
}
Node<Anything> next = new Node<>(value, null);
last.setNext(next);
last = next;
}
现在,如果您打印
toString()
,您将得到:
node1->node2->node3->[null]
希望你得到你的答案和想要的解决方案!
我学完了泛型,发现并不容易。不过,我确实理解了。这是我理解的。我要你纠正我错的地方,并回答几个问题:)。 null null null null null null null null 内部类也必须实现Serializable吗?
Java中是否有一种方法可以通过一个方法的声明返回不同的类型? 我希望此方法返回一个对象,并在函数调用时将其转换为正确的类型。这就是我的想法,但它不是这样工作的。我是否需要某种通用返回类型来执行此操作?解决这个问题的最佳方法是什么?
问题内容: 在C#中,我实际上可以这样做: 但是由于某种原因,我无法使其在Java中工作。 我要做的是在超类上创建一个静态方法,以便可以将子类转换为XML。 问题答案: 称为: 或更明确地: 更令人困惑的是,您可以拥有既构造泛型类型又具有泛型参数的构造函数。不记得该语法,也从未在愤怒中使用过它(无论如何,最好还是使用静态创建方法)。 强制转换是不安全的,并且您不能编写T.class。因此,将T.c
问题内容: 如果在Java中创建泛型类(该类具有泛型类型参数),则可以使用泛型方法(该方法带有泛型类型参数)吗? 考虑以下示例: 正如您对通用方法所期望的那样,我可以使用任何对象调用的实例: 但是,如果我尝试使用 不 指定泛型类型的实例,则无论传入什么,我都会调用返回, 奇怪的是,如果返回类型是通用类,它将编译(例如(实际上,这可以解释-参见下面的答案)): 此外,如果输入通用类,即使仅使用通配符
如果在Java中创建泛型类(该类具有泛型类型参数),是否可以使用泛型方法(该方法采用泛型类型参数)? 考虑下面的例子: 正如您所期望的那样,对于任何对象,的实例,我都可以调用: 但是,如果我试图使用的实例而不指定泛型类型,那么调用将返回一个
问题内容: 我为缓存编写了一个函数来检索特定对象。这样我就不需要投了。 我正在这样使用 但是现在我的缓存中有一个字符串列表,我不能这样使用 问题是。我对Java非常陌生,我该怎么写? 问题答案: 您无法获得的类,在您的情况下,唯一的方法是: