Search code examples
javasortinglinked-listcomparecomparison

I need some explanation about sorting nodes


I am confused how this comparing works, for example the second if statement, if comparison > 0 it should be before currentItem, but the lines inside the if statement have confused me too much, can you explain it to me how they work?

By the way

this.root

is an instance of ListItem and the code doesn't use LinkedList or ArrayList class, the code below trying to emulate something in LinkedList i think, If my questions need more explanation, tell me please. Best regards

@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;
    }

Solution

  • I added comments, plus some fixes:

    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
        }
    }
    

    Using text graphics. Say the new node N is to be inserted after A and before B. Initial state, 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
    

    The sequence is:

             N -> B                   new.nxt      = cur
        A <- N                        new.prv      = cur.prv
        A -> N                        new.prv.nxt  = new
             N <- B                   cur.prv      = new
    

    resulting in

        A -> N -> B
        A <- N <- B