删除"链接"来自LinkedList?

时间:2016-05-01 12:27:31

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

我有一个rejectedLinkedList的自己代码),其中包含LinkedList。这是完整列表: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

我可以看到搜索部分正在运行,但我无法正确删除节点部分,是否有任何建议?

2 个答案:

答案 0 :(得分:2)

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();
    }

}

答案 1 :(得分:1)

$age_range = $me['age_range']['min']; 是一个局部变量,所以

ptr

不会修改您的链接列表。

您应该修改ptr = ptr.next.next; 。除此之外,如果原始ptr.next没有引用大写字母,您可能需要修改head

这样的事情应该有效:

head