我在练习:
编写代码,将链表围绕一个值x进行分区,使小于x的所有节点都在大于或等于x的所有节点之前。示例输入:3->5->8->5->10->2->1输出:3->1->2->10->5->5->8
我发现很难找到单一链接列表(由我自己创建,不使用库)的解决方案,我想知道我的代码中是否有不必要的代码块,是否有办法避免放入两个列表,然后合并因为它的表现似乎很慢。

    public CustomLinkedList partition(CustomLinkedList list, int x) {
    CustomLinkedList beforeL = new CustomLinkedList();
    CustomLinkedList afterL = new CustomLinkedList();
    LinkedListNode current = list.getHead();
    while (current != null) {
        if (current.getData() < x) {
            addToLinkedList(beforeL, current.getData());
        } else {
            addToLinkedList(afterL, current.getData());
        }
        // increment current
        current = current.getNext();
    }
    if (beforeL.getHead() == null)
        return afterL;
    mergeLinkedLists(beforeL, afterL);
    return beforeL;
}

public void addToLinkedList(CustomLinkedList list, int value) {
    LinkedListNode newEnd = new LinkedListNode(value);
    LinkedListNode cur = list.getHead();
    if (cur == null)
        list.setHead(newEnd);
    else {
        while (cur.getNext() != null) {
            cur = cur.getNext();
        }
        cur.setNext(newEnd);
        cur = newEnd;
    }
}

public void mergeLinkedLists(CustomLinkedList list1, CustomLinkedList list2) {
    LinkedListNode start = list1.getHead();
    LinkedListNode prev = null;
    while (start != null) {
        prev = start;
        start = start.getNext();
    }
    prev.setNext(list2.getHead());
}

custumlinkedList包含两个属性:-linkedlistnode是头,int是大小。
LinkedListNode包含两个属性:一个是指向下一个节点的LinkedListNode类型,另一个是int:data-value类型
谢谢您。

最佳答案

我认为维持两份名单不是问题使用一个列表是可能的,但代价是失去了一些简单性。
主要的问题似乎是addToLinkedList(CustomLinkedList list, int value)方法。
它遍历整个列表以添加新元素。
另一种选择是总是在列表的前面添加元素。这也会产生一个有效的解决方案,并且运行得更快。

07-24 09:19