Search code examples
javacircular-list

Simplify Coefficient of Same Power Polynomial Parameters With Circular LinkedList


This method sets the coefficient and exponent values for the polynomial, in order.
It is working correctly. ( val = coeff and val2 = exp )

public void setCoef(int val, int val2){

    Node nptr = new Node(val, val2, null, null);
    Node tmp, ptr;
    boolean ins = false;

    if (start == null)
    {
        nptr.setLinkNext(nptr);
        nptr.setLinkPrev(nptr);

        start = nptr;
        end = start;
    }
    else if (val2 >= start.getData2())
    {
        nptr.setLinkPrev(end);
        end.setLinkNext(nptr);

        start.setLinkPrev(nptr);
        nptr.setLinkNext(start);

        start = nptr;
    }
    else if (val2 <= end.getData2())
    {
        end.setLinkNext(nptr);

        nptr.setLinkPrev(end);
        nptr.setLinkNext(start);

        start.setLinkPrev(nptr);

        end = nptr;
    }
    else
    {
        tmp = start;
        ptr = start.getLinkNext();

        while (ptr != null)
        {
            if (val2 <= tmp.getData2() && val2 >= ptr.getData2())
            {
                tmp.setLinkNext(nptr);
                nptr.setLinkPrev(tmp);
                nptr.setLinkNext(ptr);

                ptr.setLinkPrev(nptr);
                ins = true;

                break;
            }
            else
            {
                tmp = ptr;
                ptr = ptr.getLinkNext();
            }
        }
        if (!ins)
        {
            tmp.setLinkNext(nptr);
            nptr.setLinkPrev(tmp);
        }
    }
    size++;
}

In this example, I couldn't figure out how to simplify the 2x^3 + 5x^3 nodes as one node 7x^3 without breaking the order.

p1.setCoef(2, 3);
p1.setCoef(5, 3);

This example should be 5x^8+5x^7+5x^6.

p1.setCoef(3, 6);
p1.setCoef(5, 7);
p1.setCoef(2, 6);
p1.setCoef(5, 8);

There is no problem of my toString method as well.

Waiting for your help, thanks in advance!


Solution

  • It is better to use TreeMap instead of Circular LinkedList.

    public class Polynomial {
    
        private final TreeMap<Integer, Integer> map = new TreeMap<>();
    
        public void setCoef(int coeff, int exp) {
            Integer oldCoeff = map.get(exp);
            if (oldCoeff == null) oldCoeff = 0;
            map.put(exp, oldCoeff + coeff);
        }
    
        @Override
        public String toString() {
            StringBuilder sb = new StringBuilder();
            for (Entry<Integer, Integer> e : map.descendingMap().entrySet())
                sb.append("+").append(e.getValue()).append("x^").append(e.getKey());
            return sb.substring(1);
        }
    
        public static void main(String[] args) {
            Polynomial p1 = new Polynomial();
            p1.setCoef(3, 6);
            p1.setCoef(5, 7);
            p1.setCoef(2, 6);
            p1.setCoef(5, 8);
            System.out.println(p1); // -> 5x^8+5x^7+5x^6
        }
    }