当我尝试合并两个Sorted Linkedlists时,为什么我会得到一个空列表?

时间:2011-10-30 17:59:32

标签: java linked-list

列表按照它们应该的方式排序,但是当我尝试在makeUnion中将两个列表合并在一起时,它打印出列表为空。任何人都可以帮助我,告诉我为什么?在main中,当我尝试SortedLinkedList merge = sortedNames1.makeUnion(sortedNames2)时,我得到“空列表”。

    public class SortedLinkedList<T extends Comparable<? super T>>
                     extends LinkedList<T> 
    {
        private LinkedList<T> list;  //the sorted list

        //the constructor
        public SortedLinkedList(LinkedList<T> in)
        {
            if(in.isEmpty())
            {
               System.out.println("Empty list");
            }
            if(in.size() < 2)
            {
               return;
            }
            else
            {  
                list = new LinkedList<T>();
                for(int i = 1; i < in.size(); i++)
                {
                    T temp = in.get(i);
                    int j = i;
                    while(j > 0 && in.get(j - 1).compareTo(temp) > 0)
                    {
                        in.set(j, in.get(j-1));
                        j--;
                    }
                    in.set(j, temp);
                }
                for(T elements : in)
                {
                    list.add(elements);  
                }
            }
        }

        //return the union of the sorted linked lists this and other
        public SortedLinkedList<T> makeUnion( SortedLinkedList<T> other)
        {
            SortedLinkedList<T> first = new SortedLinkedList<T>(other);
            SortedLinkedList<T> second = new SortedLinkedList<T>(list);
            SortedLinkedList<T> UnionList = null;

            int i = 0;
            int j = 0;
            while(i<first.size() && j<second.size())
            {
                if(first.get(i).compareTo(second.get(j)) <= 0)
                {
                    UnionList.add(first.get(i));
                    i++;
                }
                else
                {
                    UnionList.add(second.get(j));
                    j++;
                }
            }

            if(i == first.size())
            {
                    for(int k = j; k<second.size(); k++)
                    {
                        UnionList.add(second.get(k));
                    }
            }
            else if(j == second.size())
            {
                    for(int x = i; x<first.size(); x++)
                    {
                        UnionList.add(first.get(x));
                    }
            }    

            return UnionList;      
        }


        //print the items int list
        public void print()
        {
            ListIterator itr = list.listIterator();
            while(itr.hasNext())
            {
                System.out.println(itr.next());
            }
        }
    }

3 个答案:

答案 0 :(得分:1)

        SortedLinkedList<T> UnionList = null;

如果UnionList.add()UnionList,则无法致电null。在添加内容之前,您需要先分配一个新列表。

实际上,我认为您原来的问题可能是SortedLinkedList 扩展 LinkedList并且还包含{{1}的实例 }。你应该选择其中一个,但不能两个。您的代码有时会访问一个列表,有时会访问另一个列表,因此一个列表显示为空,因为您已将项目添加到其他列表中。

答案 1 :(得分:0)

在开始使用UnionList之前,不要初始化它。

SortedLinkedList<T> UnionList = null;

应该阅读

SortedLinkedList<T> UnionList = new SortedLinkedList<T>();

作为奖励,ListIterator应该是ListIterator&lt; T&gt;所以使用了正确的toString()方法。实际上,你将调用Object.toString()。

答案 2 :(得分:0)

因为您使用了继承而不是委托。您继承了LinkedList,您唯一要做的就是定义一个构造函数,该构造函数以适当的顺序将未排序列表的内容添加到新列表中。但是你没有覆盖size方法,所以这个方法是从LinkedList继承的,它不关心你的内部排序列表,因此总是返回0。

在大多数情况下,扩展收藏是个坏主意。在这种情况下,这是一个特别糟糕的主意,因为不可能有一个尊重LinkedList API的排序LinkedList。假设您的列表包含A,B和C,并在其上调用addFirst("Z")。你会把Z放在哪里,如果在开头,你的列表就不再排序了。如果最后,您不尊重addFirst的合同。

只需使用链接列表(而不是扩展它们),然后对它们进行排序。你可以这么做:

LinkedList list = new LinkedList(someUnsortedList);
Collections.sort(list); // now the list is sorted
list.addAll(someOtherList);
Collections.sort(list); // now both lists are merged, and the resulting list is sorted.