为什么这个双向链接列表程序给我一个空指针异常?

时间:2019-02-04 14:05:09

标签: java data-structures doubly-linked-list

基本上,问题是:

  • 给出一个字符列表,执行以下操作,直到只有1个元素:
    1. 从头开始,删除列表的第二个节点,例如对“ abcdefghij”执行此操作应返回“ acegi”
    2. 从步骤1生成的列表的末尾开始,删除每个第二节点,因此对“ acegi”执行此操作应返回“ aei”
    3. 执行这些步骤,直到列表中只有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。但是,如果我一次只专门使用其中一个,则它们可以完美工作,但是当我将它们递归使用时,就会出现问题。

有什么办法解决这个问题吗?

1 个答案:

答案 0 :(得分:1)

可能还有其他问题,但是Try onClickHandled property <input type="checkbox" onclick="onClickHandler()" id="box" /> <script> function onClickHandler(){ var chk=document.getElementById("box").value; //use this value } </script> 在这里很明显。该语句将执行方法调用,然后递增将永远不会使用的rec(removeFront(list), n++)的值。

将此更改为n