链表的泛型实现和交换两个泛型对象

Generic type implementation of linked list and swapping two generic objects

通用 class 实现 Comparable

我的第一个问题是如何正确实现实现 compareTo 的泛型 class。我当前的 class 定义是:

public static class Node<T> implements Comparable<Node<T>>{

我的 compareTo 方法是:

public <T extends Comparable<T>> int compareTo(Node<T> n){

1a。这些定义正确吗?

1b。我应该如何完成我的 compareTo 方法?我在网上找到的许多文献都提到了在方法本身中使用 .compareTo(),这对我来说没有意义。

交换链表中的两个节点:

我当前的方法定义是

public void swap(Node<T> n1, Node<T> n2){
    // swap
}
  1. 是否可以在单链表实现中交换两个节点,或者交换方法是否固有地需要链表的双链实现?

1a. Are these definitions correct?

不完全是。您对 compareTo 的定义是声明一个类型变量,这可能是错误的:

public <T extends Comparable<T>> int compareTo(Node<T> n){

(实际上不应该编译。)

应该是:

@Override
public int compareTo(Node<T> n){

1b. How should I complete my compareTo method?

这取决于您要比较的内容。因为你没有具体说明,我们不知道。 ; )

Much of the literature I have found online has referenced using .compareTo() within the method itself, which does not make sense to me.

这是一个典型用法的例子:

// saying T must also be Comparable:
// it's possible you are supposed to do
// this for your own Node declaration too
//         vvvvvvvvvvvvvvvvvvvvvvv
class Node<T extends Comparable<T>> implements Comparable<Node<T>> {
    T data;

    @Override
    public int compareTo(Node<T> that) {
        return this.data.compareTo( that.data );
    }
}

现在我们可以比较节点,但它实际上委托给了任何数据。我们不知道也不关心数据是什么(尽管它不能为空),只是它实现了 Comparable.

2. Is it possible to swap two nodes in a singly linked list implementation, or does the swap method inherently require a doubly linked implementation of a linked list?

这里的提示是您不需要交换节点,无论它们的数据是什么。

My current class definition is:

public static class Node<T> implements Comparable<Node<T>>{

and my compareTo method is:

public <T extends Comparable<T>> int compareTo(Node<T> n){

1a. Are these definitions correct?

class 声明看起来不错。与其说是 compareTo() 方法。通过在方法 (<T extends Comparable<T>>) 上指定类型参数,您声明了一个泛型方法,它与恰好依赖于 class 的普通方法不同。 =37=]类型参数。你想要这个,而不是:

public int compareTo(Node<T> n){

1b. How should I complete my compareTo method? Much of the literature I have found online has referenced using .compareTo() within the method itself, which does not make sense to me.

您可以根据 Node class 的字段以任何有意义的方式实施该方法。如果您不清楚什么会使 Node 比另一个少,那么 class 可能不应该实施 Comparable.

您对使用 .compareTo() 的困惑在问题本身中很明显。 compareTo() 作为特定 class 上下文之外的方法名称没有意义。这样的方法有很多,各不相同。在很多情况下,在实现一个不同[=39=的compareTo()方法时,使用一个class的compareTo()方法是明智的].

  1. Is it possible to swap two nodes in a singly linked list implementation, or does the swap method inherently require a doubly linked implementation of a linked list?

可以在单链表中交换节点。您可能只能交换有效负载,但如果必须交换节点对象本身,那么您将需要遍历列表以找到每个节点的前一个节点。根据您的数据结构的详细信息,当要交换的节点之一是列表中的第一个时,您可能需要特殊处理。