【问题标题】:Removing "links" from a LinkedList?从 LinkedList 中删除“链接”?
【发布时间】:2023-04-03 18:31:01
【问题描述】:

我有一个LinkedListLinkedList 的自己的代码),其中包含char。这是完整列表:['a','b','I','d','R','A','7','p']

我正在尝试编写一种方法来删除所有不是大写字母的字符。运行该方法后,LinkedList 应如下所示['I','R','A']

但是在运行我的代码后,我得到了与return 相同的列表,这个列表:['a','b','I','d','R','A','7','p']

这是我的方法代码:

public static ListNode copyUpperCase(ListNode head) {

    ListNode ptr = head;
    while(!isEmpty(ptr.next)){
        if(!Character.isUpperCase(ptr.element)){
            ptr = ptr.next.next;
            //System.out.println(ptr.element);
        }
        ptr = ptr.next;
    }
    return head;
}

这里是isEmpty()

public static boolean isEmpty(ListNode l) {
    if ( l == null )
        throw new ListsException("Lists: null passed to isEmpty");
    return l.next == null;
}

这里是ListNode

public class ListNode {
    public char element;
    public ListNode next;
}

我可以看到搜索部分正在工作,但我无法正确删除节点部分,有什么建议吗?

【问题讨论】:

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


    【解决方案1】:
    public static ListNode copyUpperCase(ListNode head) {
        ListNode ptr = head;
        while(!isEmpty(ptr.next)){
            if(!Character.isUpperCase(ptr.element)){
                ptr.next = ptr.next.next;
                //System.out.println(ptr.element);
            }
            ptr = ptr.next;
        }
        return head;
    }
    

    您需要“更改”列表,因此您只是错过了对元素的赋值,而不是局部变量

    但是,此代码不起作用,因为它只是分配给下一个元素,而不查看下一个元素是否真的是一个好元素,然后跳到那个

    编辑:完整的工作代码

    class ListNode {
    
        public ListNode(char element,ListNode next ) {
            this.element = element;
            this.next = next;
        }
    
        public char element;
        public ListNode next;
    
        void print() {
            System.out.print(this.element+",");
            if(this.next != null) {
                this.next.print();
            }
            else {
                System.out.println("");
            }
    
        }
    
    }
    public class main {
    
    
        //Imo you should only check if this elem is a null one, as a null means empty, a null on next only means that it's the last elem, but will still contain data
        public static boolean isEmpty(ListNode l) {
            return l == null;
        }
    
        public static ListNode getNextUpper(ListNode head) {
            while(!isEmpty(head)){
                if(Character.isUpperCase(head.element)) {
                    return head;
                }
                head = head.next;
            }
            return null;
        }
    
        public static ListNode copyUpperCase(ListNode head) {
            ListNode newhead = getNextUpper(head);
            ListNode temp = newhead;
            while(!isEmpty(temp)){
                temp.next = getNextUpper(temp.next);
                temp = temp.next;
            }
            return newhead;
        }
    
        public static void main(String[] args) {
            ListNode t = new ListNode('a' , new ListNode('b' , new ListNode('I', new ListNode('d', new ListNode('R', new ListNode('A', new ListNode('7', new ListNode('p',null))))))));
    
            t.print();
    
            ListNode newt = copyUpperCase(t);
    
            newt.print();
        }
    
    }
    

    【讨论】:

    • 我无法让它工作,它会抛出异常,“null pass”在这一行:while(!isEmpty(temp)){ in CopperUpperCase 方法:(
    • 我更改了代码中的 isEmpty,你用那个吗?
    • 我现在试过了,但我仍然得到“java.lang.NullPointerException”,并且我不允许更改 isEmpty() 方法,因为这是学校作业。你有什么建议如何不得到异常,我试过了,但结果搞砸了。
    【解决方案2】:

    ptr 是一个局部变量,所以

    ptr = ptr.next.next;
    

    不会修改您的链表。

    您应该改为修改ptr.next。除此之外,你可能需要修改head,如果原来的head不是大写字母。

    这样的事情应该可以工作:

    // find the first valid (upper case) element and set head to refer to it
    while (!Character.isUpperCase(head.element) && head != null)
        head = head.next;
    ListNode ptr = head; 
    if (ptr != null)
        // eliminate all non-upper case elements
        while(!isEmpty(ptr.next)){
            if(!Character.isUpperCase(ptr.next.element)){
                ptr.next = ptr.next.next;
            }
            ptr = ptr.next;
        }
    }
    return head;
    

    【讨论】:

    • 我试过了,我得到了结果 ['R','A','p'],所以它似乎跳过了第一个大写字符并且也没有删除最后一个字符,我试着修改您的代码以使其正常工作。
    • 忘了提,我得到了异常错误,因为“空列表通过”,将“while(!isEmpty(ptr.next)”更改为“while(!isEmpty(ptr))”,现在我得到了['R','A','p'] 结果。
    猜你喜欢
    • 2012-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-02
    • 2015-08-26
    • 1970-01-01
    相关资源
    最近更新 更多