使用已排序的linkedList实现多集

时间:2016-03-30 09:09:01

标签: java linked-list multiset

您好我使用链表实现了多重集,我想使用已排序的链表实现多重集。这是multiset抽象类。

import java.io.PrintStream;

public abstract class Multiset<T> {
    /**
     * Delimiter string for print operation.
     */
    protected static final String printDelim = " | ";

    public abstract void add(T item);

    public abstract int search(T item);

    public abstract void removeOne(T item);

    public abstract void removeAll(T item);

    public abstract void print(PrintStream out);
} 

这是我对链表的实现。

import java.io.PrintStream;

public class LinkedListMultiset<T> extends Multiset<T> {
    protected Node mHead;
    protected int mLength;

    public LinkedListMultiset() {
        // Implement me!
        mHead = null;
        mLength = 0;
    }

    public void add(T item) {
        Node newNode = new Node((String) item);
        if (mHead == null)
            mHead = newNode;
        else {
            Node currNode = mHead;
            Node parentNode = null;
            while (currNode != null) {
                if (currNode.getValue().
                        equals(newNode.getValue())) {
                    currNode.addCounter();
                    return;
                }
                parentNode = currNode;
                currNode = currNode.getNext();
            }
            parentNode.setNext(newNode);
        }
        mLength++;
    }

    public int search(T item) {
        Node currNode = mHead;

        while (currNode != null) {
            if (currNode.getValue().equals((String) item)) {
                return currNode.getCounter();
            }
            currNode = currNode.getNext();
        }

        return 0;
    }

    public void removeOne(T item) {
        Node currNode = mHead;
        Node lastNode = null;

        while (currNode != null) {
            if (currNode.getValue().equals((String) item)) {
                currNode.minusCounter();
                if (currNode.getCounter() == 0) {
                    if (currNode == mHead)
                        mHead = currNode.getNext();
                    else
                        lastNode.setNext
                                (currNode.getNext());
                    mLength--;
                }
                return;
            }
            lastNode = currNode;
            currNode = currNode.getNext();
        }
    }

    public void removeAll(T item) {
        Node currNode = mHead;
        Node lastNode = null;

        while (currNode != null) {
            if (currNode.getValue().equals((String) item)) {
                if (currNode == mHead)
                    mHead = currNode.getNext();
                else
                    lastNode.setNext(currNode.getNext());
                mLength--;
                return;
            }
            lastNode = currNode;
            currNode = currNode.getNext();
        }
    }

    public void print(PrintStream out) {
        Node currNode = mHead;

        while (currNode != null) {
            out.printf("%s | %d\n", currNode.getValue()
                    , currNode.getCounter());
            currNode = currNode.getNext();
        }
    }

    private class Node {
        protected String mValue;
        protected Node mNext;

        int counter;

        public Node(String value) {
            mValue = value;
            mNext = null;
            counter = 1;
        }

        public void addCounter() {
            counter++;
        }

        public void minusCounter() {
            counter--;
        }

        public int getCounter() {
            return counter;
        }

        public String getValue() {
            return mValue;
        }

        public Node getNext() {
            return mNext;
        }

        public void setValue(String value) {
            mValue = value;
        }

        public void setNext(Node next) {
            mNext = next;
        }
    }
}

我想实现已排序的链表,但我希望尽可能减少我的代码。

0 个答案:

没有答案