我正在尝试编写代码来围绕值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值。任何人都可以建议一种解决方法吗?谢谢。
答案 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;
}