为什么这个双链表程序会给我一个空指针异常? [重复]

问题描述 投票:-2回答:1

这个问题在这里已有答案:

基本上,问题是:

  • 给定一个字符列表,执行以下操作,直到它只有1个元素: 从头开始,删除列表中的每个第二个节点,例如这样做“abcdefghij”应该返回“acegi” 从步骤1生成的列表末尾开始,删除每个第二个节点,这样做“acegi”应该返回“aei” 执行这些步骤,直到列表只有1个元素

这个特定列表的最终解决方案应该是“i”。

我的解决方案是:

public class listexercise {

    public static DLL<Character> removeFront(DLL<Character> list){

        DLLNode<Character> tmp = list.getFirst().succ;

        while(tmp != null){
            list.delete(tmp);
                if(tmp.succ == null) {
                    tmp.pred.succ = null;
                    break;
                }
            tmp = tmp.succ.succ;
        }

        return list;

    }
    public static DLL<Character> removeEnd(DLL<Character> list){

        DLLNode<Character> tmp = list.getLast().pred;

        while(tmp != null){
            list.delete(tmp);
            if(tmp.pred == null) {
                tmp.succ.pred = null;
                break;
            }
            tmp = tmp.pred.pred;
        }

        return list;        
    }
    public static DLL<Character> rec(DLL<Character> list, int n){
        if(list.length() == 1)
            return list;
        else if(n%2 == 1)
            return rec(removeFront(list), n++);
        else if(n%2 == 0)
            return rec(removeEnd(list), n++);

            return list;
    }

    public static void main(String[] args) {

        Scanner s = new Scanner(System.in);

        DLL<Character> list = new DLL<Character>();
        String input = s.nextLine();
        char[] parts = input.toCharArray();

        for(int i=0; i<parts.length; i++)
            list.insertLast(parts[i]);

        System.out.println(rec(list,1).toString());
    }
}

这给了我removeFront或removeEnd上的NPE。但是,如果我一次只使用其中一个,它们可以完美地工作,但是当我将它们放入递归时,就会出现问题。

任何想法如何解决这一问题??

java data-structures doubly-linked-list
1个回答
1
投票

可能还有其他问题,但rec(removeFront(list), n++)在这里非常明显。这个语句将执行方法调用,然后递增永远不会使用的n的值。

将此更改为rec(removeFront(list), n+1)

© www.soinside.com 2019 - 2024. All rights reserved.