我需要一些有关排序节点的解释

时间:2019-09-17 21:20:11

标签: java sorting linked-list compare comparison

我对这种比较的工作方式感到困惑,例如第二条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;
    }

1 个答案:

答案 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