【发布时间】:2011-03-03 19:35:28
【问题描述】:
在这里回顾我的基本 ADT 内容以进行面试修改,并在我学习 Java 的同时尝试用一块石头杀死两只鸟。尝试使用通用链表(我自己创建)为合并排序编写一个简单的算法。事实证明这比我最初想象的要困难得多!谁能帮帮我?我将从基础开始工作,并会随着我的深入而更新这篇文章。
我的通用链表代码如下:
public class NodeList<T extends Comparable<T> > {
private T head;
public NodeList<T> tail;
public NodeList( T item, NodeList<T> list ) {
head = item;
tail = list;
}
}
我正在尝试在我制作的另一个类中访问该类,如下所示:
public class MyList<T extends Comparable<T>> {
private NodeList<T> nodes;
private static int size;
public MyList( ) {
nodes = null;
}
public MyList(T[] array ){
for( T item : array ) {
nodes = new NodeList<T>(item, nodes);
}
size = array.length;
}
public void add( T item ) {
nodes = new NodeList<T>( item, nodes );
size++;
}
public void addEnd( T item ) {
NodeList<T> temp = nodes;
while ( temp == null || temp.tail != null) {
temp = temp.tail;
}
size++;
temp.tail = new NodeList<T> ( item, null);
}
我相信,到目前为止,在 add 和 addEnd 方法之前,一切都是正确的,它们应该分别在列表的开头和列表的结尾添加一个泛型。
我的代码继续:
public static <S extends Comparable<S>>
MyList<S> sort( MyList<S> list ) {
if ( size > 1 ) {
MyList<S> left = leftHalf( list );
MyList<S> right = rightHalf( list );
list = merge( left, right );
}
return list;
}
private static <S extends Comparable<S>>
MyList<S> merge( MyList<S> left, MyList<S> right ) {
}
private static <S extends Comparable<S>>
MyList<S> leftHalf( MyList<S> list ) {
MyList <S> leftSide = new MyList();
int middle;
if(size % 2 == 1) {
middle = size +1;
} else {
middle = size;
}
for ( int countToMiddle = 0; countToMiddle < middle ; countToMiddle++ ) {
leftSide.addEnd(nodes);
}
// return elements from 0 .. list.size() / 2
}
我得到了错误:
MyList 中的addEnd(S) 不能应用于(NodeList)
当我运行时发生
leftSide.addEnd(nodes);
谁能看到这个原因/告诉我到目前为止我的工作是否正确?再次感谢!
【问题讨论】:
-
想想
T和Comporable之间的关系。 -
问题的第二个版本,看起来
MyList leftSide应该是MyList<S> leftSide。确保您摆脱警告,包括原始类型(我认为这是在当前的 JDK6 中)。 -
已编辑以解决该问题,谢谢,不幸的是,MyList
中的 addEnd(S) 无法应用于 (NodeList) 错误!再次感谢:) -
addEnd(T item) 需要 T 类型的对象,而不是 NodeList
作为参数。 -
另外:
leftSide.addEnd(nodes);->nodes来自哪里?