我想从线性链接列表中删除具有最大通用T对象的Node(列表仅包含头部),然后返回该Node的对象。方法签名必须看起来像这样,以及我到目前为止得到的代码:
列表如下:
public List<T extends Comparable<T>>{
private Node<T> head;
public List(){
this.head = null;
}
//inner class Node
public class Node<T>{
T obj;
Node<T> next;
}
public Node(T obj){
this.obj = obj;
}
//the method my question is about
public T remove(){
if(head == null) return null;
else {
Node<T> act = head;
Node<T> prev = head //previous Node
Node<T> biggest;
while(act != null){
if(act.obj.compareTo(prev.obj) > 0) {
biggest = act;
}
prev = p;
p = p.next;
}
return biggest.obj;
}
}
此代码仅获取最大的对象,而不删除节点。我不知道如何适应while循环来删除节点。如果我找到了最大的Element,则prev.next指针必须以某种方式转到act.next节点。
答案 0 :(得分:0)
您的代码当前执行的操作是比较两个相邻的节点if(act.obj.compareTo(prev.obj)
,在这里我假设节点没有按值排序(您在问题中没有提到),所以这是不正确的。
您想要做的是:
T biggestValue = head.obj;
// 1
while(act != null) {
if(act.obj.compareTo(biggestValue.obj) > 0) {
biggestValue = act.obj;
}
}
// 2
while(act != null) { // that loop and its body could be simplified by using: while(!act.obj.equals(biggestValue)) but I leave it that way for brevity
if(act.obj.equals(biggestValue)) {
prev.next = act.next;
break;
}
prev = act;
act = act.next;
}
答案 1 :(得分:0)
提示:如果单链列表包含多个项,并且您想剪切出包含最大值的节点,则必须使用两个while循环,第一个循环标识最大的值,即第二个循环以查找包含该最大值的节点并将其从列表中剪切。