我对这种比较的工作方式感到困惑,例如第二条if语句,如果if> 0,它应该在currentItem之前,但是if语句中的行让我很困惑,您能向我解释一下它们如何工作?
顺便
this.root
是ListItem的一个实例 并且代码不使用LinkedList或ArrayList类,下面的代码我想在LinkedList中模仿某些东西,如果我的问题需要更多解释,请告诉我。 最好的问候
@Override
public boolean addItem(ListItem newItem) {
if(this.root == null){
this.root = newItem;
return true;
}
ListItem currentItem = this.root;
while (currentItem != null){
int comparison = currentItem.compareTo(newItem);
if (comparison < 0){
if (currentItem.next()!=null){
currentItem = currentItem.next();
}
else{
currentItem.setNext(newItem);
newItem.setPrevious(currentItem);
return true;
}
}
else if (comparison > 0){
// new Item is less, insert before
if (currentItem.previous()!= null){
currentItem.previous().setNext(newItem);
newItem.setPrevious(currentItem.previous());
newItem.setNext(currentItem);
currentItem.setPrevious(newItem);
}else{
newItem.setNext(this.root);
this.root.setPrevious(newItem);
this.root = newItem;
}
}
}
return false;
}
答案 0 :(得分:1)
我添加了评论以及一些修复程序:
public boolean addItem(ListItem newItem) {
if(this.root == null){
this.root = newItem;
return true;
}
ListItem currentItem = this.root;
while (currentItem != null){
int comparison = currentItem.compareTo(newItem);
if (comparison < 0){ // if cur < new
newItem.setPrevious(currentItem.previous()); // advance cur
if (currentItem.next()!=null){
currentItem = currentItem.next();
} else { // if end list
currentItem.setNext(newItem); // append new
newItem.setPrevious(currentItem);
return true;
}
} else if (comparison > 0){
// new < cur, insert before, fixes made to this part
newItem.setNext(currentItem); // set new.nxt
newItem.setPrevious(currentItem.previous()); // set new.prv
if (newItem.previous()!= null){ // if new.prv != 0
newItem.previous().setNext(newItem); // set new.prv.nxt
else // else
this.root = newItem; // set root
currentItem.setPrevious(newItem); // set cur.prv
return true;
}
return false; // return false if duplicate
}
}
使用文本图形。假设要在A之后和B之前插入新节点N。初始状态,cur(currentItem)= B:
cur == B
A <------ B 0 <- N cur.prv == A new.prv = 0
A ------> B N -> 0 cur.prv.nxt == B new.nxt = 0
顺序为:
N -> B new.nxt = cur
A <- N new.prv = cur.prv
A -> N new.prv.nxt = new
N <- B cur.prv = new
导致
A -> N -> B
A <- N <- B