围绕整数值对链表进行分区

时间:2017-01-31 04:59:36

标签: java algorithm linked-list

我正在尝试编写代码来围绕值x对链表进行分区,这样所有小于x的节点都会出现在大于或等于x的所有节点之前。如果x包含在列表中,则x的值必须在小于x的元素之后。但是,分区元素x可以出现在“右分区”中的任何位置。

输入3-> 5-> 8-> 5-> 10-> 2-> 1 [partition = 5] 输出3-> 1-> 2-> 10-> 5-> 5-> 8

Node类定义如下。

class Node{
    Node next = null;
    int data;
    public Node(int d){
        data =d;
    }
    public Node() {
        // TODO Auto-generated constructor stub
    }
    void appendToTail(int d){
        Node end = new Node(d);
        Node n = this;
        while(n.next!=null){
            n = n.next;
        }
        n.next = end;
    }

以下是我提出的半工作代码。

static void Partition(Node n,int numb){
    Node tail = n;
    while(tail.next != null){
        tail = tail.next;
    }

Node current = n;

Node tailCurrent = tail;
Node prev = null;
while(current!= tailCurrent){
    if(current.data<numb){

        prev = current;
        System.out.println(prev.data);
    }
    else{
        prev.next = current.next;
        tail.next = current;
        tail = current;

    }
    current =current.next;
}


tail.next = null;


}

对于头节点具有小于分区编号的整数的情况,它可以正常工作,但是当头节点具有大于或等于分区编号的整数时,会发生错误。我相信这是因为在我的代码中的else语句中,prev.next抛出一个空指针异常,因为它永远不会通过if情况具有非null值。任何人都可以建议一种解决方法吗?谢谢。

1 个答案:

答案 0 :(得分:0)

如果没有要更新的上一个节点,则无需执行任何操作。

所以改变这个:

prev.next = current.next;

到此:

if (prev != null) {
    prev.next = current.next;
}

还有另一个问题:列表的根目录在分区期间可能会发生变化,并且调用代码无法访问新的根目录。可以通过使Partition方法跟踪当前根的位置并最终将其返回来修复它。

static Node Partition(Node n, int numb) {
    Node tail = n;
    while(tail.next != null) {
        tail = tail.next;
    }
    Node current = n;
    Node root = n;
    Node tailCurrent = tail;
    Node prev = null;
    while(current != tailCurrent) {
        if(current.data < numb) {
            prev = current;
        } else {
            if (prev != null) {
                prev.next = current.next;
            } 
            if (root == current) {
                root = current.next;
            }
            tail.next = current;
            tail = current;
        }
        current = current.next;
    }
    tail.next = null;
    return root;
}