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



实现可比的泛型类

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

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

我的比较方法是:

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

1一.这些定义是否正确?

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

交换链表中的两个节点:

我当前的方法定义是

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

1a.这些定义是否正确?

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

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

(它实际上不应该编译。

它应该只是:

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

1b.我应该如何完成我的比较方法?

这取决于你应该比较什么。由于您尚未指定,我们不知道。;)

我在网上找到的许多文献都在方法本身中使用了.compareTo(),这对我来说没有意义。

下面是通常如何使用它的示例:

// 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. 是否可以在单链表实现中交换两个节点,或者交换方法本身需要链表的双链实现?

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

我目前的类定义是:

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

我的比较方法是:

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

1一.这些定义是否正确?

类声明看起来不错。 与其说是compareTo()方法。 通过在方法(<T extends Comparable<T>>)上指定类型参数,您正在声明一个泛型方法,它与碰巧依赖于类的类型参数的普通方法不同。 相反,你想要这个:

public int compareTo(Node<T> n){

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

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

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

  1. 是否可以在单向链表实现中交换两个节点,或者交换方法本身是否需要链表的双链实现?

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

最新更新