合并两个未分类的单链表

时间:2011-03-25 11:14:07

标签: java merge linked-list

我写了一个函数,它合并了两个未分类的单链表。我只是将第二个列表中的每个节点添加到原始列表的前面。它似乎有效,除了当我打印原始的,现在合并的列表时,新添加的元素是'null'

public SLL mergeUnsorted(SLL otherList)
{
    Iterator itr = otherList.iterator() ;
    while (itr.hasNext())
    {
        Object elem  = itr.next() ;
        System.out.println(elem) ; // to make sure the elements are retrieved correctly
        SLLNode ins = new SLLNode(elem, null) ; // make a node out of the element 
        ins.succ = this.first ; // insert the element to the front of the original list
        this.first = ins ;
    }
    return this ;
}

从main调用函数:

myList = myList.mergeUnsorted(otherList) ;
printIt(myList) ;

输出:

null null null null Hi Hello Salut Ciao

SLLNode构造函数:

public SLLNode(Object ObjElem, SLLNode succ)
{
    this.ObjElem = ObjElem ;
    this.succ = succ ;
}

[编辑]

class SLL
{
    SLLNode first ;

    public SLL()
    {
        first = null ;
    }
...

注1:练习声明SLL类数据表示仅包含第一个节点private SLLNode first ;因此我不能使用任何对“last”节点的引用

注2:练习包含一个我可能需要使用的方法,但我看不出如何。

private SLLNode node(int i)
{
    SLLNode curr = first ;
    for(int j=0; j<i; j++){
        curr = curr.succ ;
        }
    return curr ;
}

注3:我可以在这里添加迭代器实现代码但是考虑到我可以使用相同的迭代器打印列表,它似乎都是正确的,所以我宁愿不要过多地混淆这篇文章。希望没关系?

[EDIT2]

public static void main(String[] args)
{
    SLL myList = new SLL() ;
    SLL otherList = new SLL() ;  
    SLLNode a = new SLLNode("xx", null) ;
    SLLNode b = new SLLNode("yy", null) ;
    SLLNode c = new SLLNode("ww", null) ;
    SLLNode d = new SLLNode("aa", null) ;
    SLLNode e = new SLLNode("rr", null) ;

    otherList.addFirst(a) ;
    printIt(otherList) ;
    otherList.addFirst(b) ;
    printIt(otherList) ;
    otherList.addFirst(c) ;
    printIt(otherList) ;
    otherList.addFirst(d) ;
    printIt(otherList) ;

    SLLNode A = new SLLNode("Hello", null) ;
    SLLNode B = new SLLNode("Hi", null) ;
    SLLNode C = new SLLNode("Salut", null) ;
    SLLNode D = new SLLNode("Ciao", null) ;
    SLLNode E = new SLLNode("Moin", null) ;

    myList.addFirst(A) ;
    printIt(myList) ;
    myList.addFirst(B) ;
    printIt(myList) ;
    myList.addFirst(C) ;
    printIt(myList) ;
    myList.addFirst(D) ;
    printIt(myList) ;

    myList = myList.mergeUnsorted(otherList) ;
    printIt(myList) ;
}

[EDIT3] @Paulo,包含在Edit2中的main生成的完整输出

xx
yy xx
ww yy xx
aa ww yy xx
Hello
Hi Hello
Salut Hi Hello
Ciao Salut Hi Hello
aa
ww
yy
xx
null null null null Ciao Salut Hi Hello

请注意,第9-12行来自合并函数

中的print语句

2 个答案:

答案 0 :(得分:0)

从你的片段看起来是正确的(但我会使用this.first = new SLLNode(elem, this.first)并省略接下来的两个语句)。您的mergeUnsorted方法打印了什么?


编辑:我不知道出了什么问题,但显然你的addFirst方法有效,而直接添加却无法正常工作。所以使用这个:

public SLL mergeUnsorted(SLL otherList)
{
    Iterator itr = otherList.iterator() ;
    while (itr.hasNext())
    {
        Object elem  = itr.next() ;
        System.out.println(elem) ; // to make sure the elements are retrieved correctly
        SLLNode ins = new SLLNode(elem, null) ; // make a node out of the element 
        this.addFirst(ins);
    }
    return this ;
}

当然,这会以相反的顺序添加元素,但现在也会发生同样的事情(它只是不起作用)。

答案 1 :(得分:0)

为什么不更改实现,因此第一个列表中最后一个节点的后继指向另一个列表中的第一个节点。

public SLL mergeUnsorted(SLL otherList)
{
    if (otherList != null && otherList.first != null) {
        SLLNode last = null;
        Iterator itr = iterator() ;
        for (itr.hasNext())
        {
            Object elem  = itr.next() ;
            if (elem.succ == null) {
                last = elem;
            }
        }
        if (last != null) {
            last.succ = otherList.first;
        }
    }    
    return this;
}