当前位置: 首页 > 知识库问答 >
问题:

带有链表的泛型方法

严承允
2023-03-14

嗨,我正在努力让这两种方法发挥作用,但即使我尝试了几乎所有我能想到的方法,它仍然不起作用。请告诉我怎么修!

空添加(任何值):将一个包含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;
}
 }

共有1个答案

宰父衡
2023-03-14

有点长的回答,试着解释每一个问题并给出解决方案。有耐心!

你的代码正是按照你告诉它的去做,以相反的方式添加新节点。它将新节点添加为第一个,并将当前第一个设置为新节点的下一个,同时调用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非常陌生,我该怎么写? 问题答案: 您无法获得的类,在您的情况下,唯一的方法是: