为什么我不能使用while循环遍历2个双向链接列表?

时间:2018-01-03 12:45:57

标签: java while-loop linked-list doubly-linked-list

好的,所以任务是:

给定2个整数列表,按照以下规则将它们合并为一个:

  1. 可以互换地添加两个列表中的所有偶数(list1从第一个开始,list2从最后一个开始)

  2. 从list1中添加所有剩余的偶数。

  3. 从list2添加所有剩余的偶数。

  4. 从第一个

  5. 开始添加list1中的所有奇数
  6. 从最后一个开始添加list2中的所有奇数。

  7. 所以对于前。

    list1:1 2 3 4 4 5 6 list2:7 8 9 10

    list3应为:10 2 8 4 4 6 1 3 5 9 7

    但是我的功能返回2 4 4 6 8 10 1 3 5 7 9

    这是我写的功能:

    public static void merge(DLL<Integer> list1 , DLL<Integer> list2, DLL<Integer> list3) {
    
        DLLNode<Integer> curr1=list1.getFirst();
        DLLNode<Integer> curr2=list2.getLast();
    
        while (curr1!=null && curr2!=null) {
    
            if (curr1.element%2==0) list3.insertLast(curr1.element);
            curr1=curr1.succ;
    
            if (curr2.element%2==0) list3.insertLast(curr2.element);
            curr2=curr2.pred;
        }
    
        if (curr1!=null) {
            while (curr1!=null) {
                if (curr1.element%2==0)
                    list3.insertLast(curr1.element);
                curr1=curr1.succ;
            }
        }
    
        if (curr2!=null) {
            while (curr2!=null) {
                if (curr2.element%2==0)
                    list3.insertLast(curr2.element);
                curr2=curr2.pred;
            }
        }
    
        curr1=list1.getFirst();
        while (curr1!=null) {
            if (curr1.element%2!=0)
                list3.insertLast(curr1.element);
            curr1=curr1.succ;
        }
    
        curr2=list2.getLast();
        while (curr2!=null) {
            if (curr2.element%2!=0)
                lista.insertLast(curr2.element);
            curr2=curr2.pred;
        }
    
    
    
    }
    

    不知何故,它没有进入第一个while循环。可能是什么原因?

1 个答案:

答案 0 :(得分:0)

您没有添加偶数元素可互换。如果输出列表的第一个元素应该是第一个列表的偶数元素,则必须迭代第一个列表,直到找到该列表中的第一个偶数元素。那么你应该开始迭代第二个列表。

您可以使用一个标志来告诉您应该从哪个列表中选择下一个偶数元素:

boolean takeFirst = true;
while (curr1!=null && curr2!=null) {
    if (takeFirst) { // next even element should come from the first list
        if (curr1.element%2==0) {
            list3.insertLast(curr1.element);
            takeFirst = false;
        }
        curr1=curr1.succ;
    }
    if (!takeFirst) { // next even element should come from the second list
        if (curr2.element%2==0) {
            list3.insertLast(curr2.element);
            takeFirst = true;
        }
        curr2=curr2.pred;
    }
}