在javascript中对linkedlist进行分区

在javascript中对linkedlist进行分区,javascript,algorithm,data-structures,linked-list,Javascript,Algorithm,Data Structures,Linked List,我正在尝试对linkedlist进行分区,但当没有元素小于当前值时,似乎无法使其工作。这个想法基于val,小于参数值的项目在linkedlist中向左移动,大于参数值的项目向右移动。我改变了一些条件,添加到“大于”和“小于”的链接列表中,但是如果项目在中间,它将停止工作。我错过了什么?我已经在这上面呆了很长时间了。这里最相关的函数是“分区”函数,其他所有函数都是辅助函数 var LinkedList = function () { this.head = null; this.tail

我正在尝试对linkedlist进行分区,但当没有元素小于当前值时,似乎无法使其工作。这个想法基于val,小于参数值的项目在linkedlist中向左移动,大于参数值的项目向右移动。我改变了一些条件,添加到“大于”和“小于”的链接列表中,但是如果项目在中间,它将停止工作。我错过了什么?我已经在这上面呆了很长时间了。这里最相关的函数是“分区”函数,其他所有函数都是辅助函数

var LinkedList = function () {
  this.head = null;
  this.tail = null;
};

LinkedList.prototype.makeNode = function (val) {
  var node = {};
  node.val = val;
  node.next = null;
  return node;
};

LinkedList.prototype.partition = function (val) {
  var lesserThanVal = new LinkedList();
  var greaterThanVal = new LinkedList();
  var iterator = this.head;

  while (iterator) {
    if (iterator.val < val) {
      lesserThanVal.addToTail(iterator.val);
    } else if (iterator.val >= val) {
      greaterThanVal.addToTail(iterator.val);
    }
    iterator = iterator.next;
  }

  //now merge them.
  if (lesserThanVal.head === null) {
    console.log("LESSER IS NULL")
    return greaterThanVal;
  }
  if (greaterThanVal.head === null) {
    console.log("GREATER IS NULL")
    return lesserThanVal;
  } else {
    //merge
    var pointer = lesserThanVal.head;
    while (pointer.next) {
      pointer = pointer.next;
    }
    pointer.next = greaterThanVal.head;
    lesserThanVal.tail = greaterThanVal.tail;


    console.log("SHOULD BE 9", lesserThanVal.head.next.next);
    return lesserThanVal;
  }

};

LinkedList.prototype.addToTail = function (value) {

  var newTail = this.makeNode(value);

  if (!this.head) {
    this.head = newTail;
  }
  if (this.tail) {
    this.tail.next = newTail;
  }
  this.tail = newTail;
};

fiddle:

根据您编写的代码,您得到的结果是正确的,但是要获得您想要的顺序,只需将
=
符号移到小于的一侧即可

while(iterator){
    if(iterator.val <= val){
        lesserThanVal.addToTail(iterator.val);
    }else if(iterator.val > val){
        greaterThanVal.addToTail(iterator.val);
    }
    iterator = iterator.next;
}
while(迭代器){
if(iterator.val){
greaterThanVal.addToTail(迭代器.val);
}
迭代器=迭代器.next;
}

在对列表进行分区或合并时,您并没有很好地处理分区点。 a) 在进行分区时,需要对其进行迭代 b) 在将列表重新合并到一起时,您不会处理它

它还回避了一个问题:如果您选择了一个不在列表中的分区点,会发生什么

一种处理你现在拥有的不考虑列表中的点的方法是用你的分区点开始更大的,不要在分区中考虑你的分区点,然后合并两个列表,只要LeSerSerTalk不是空的。

greaterThanVal.addToTail(val);
while (iterator) {
    if (iterator.val < val) {
      lesserThanVal.addToTail(iterator.val);
    } else if (iterator.val > val) {
      greaterThanVal.addToTail(iterator.val);
    }
    iterator = iterator.next;
  }

  //now merge them.
  if (lesserThanVal.head === null) {   
    return greaterThanVal;
  } else {
    var pointer = lesserThanVal.tail;
    pointer.next = greaterThanVal.head;
    lesserThanVal.tail = greaterThanVal.tail;
    return lesserThanVal;
  }
}
greaterThanVal.addToTail(val);
while(迭代器){
if(iterator.valval){
greaterThanVal.addToTail(迭代器.val);
}
迭代器=迭代器.next;
}
//现在合并它们。
如果(lesserThanVal.head==null){
返回更大的阈值;
}否则{
var指针=lesserThanVal.tail;
pointer.next=greaterThanVal.head;
lesserThanVal.tail=greaterThanVal.tail;
返回值小于serthanval;
}
}

谢谢,现在就这么做测试你的小提琴,我没发现有什么问题。您是否能够包含预期输出和控制台输出的示例?是的,我在JS提琴的底部提供了这些示例,请参见注释:所有提供的示例都是正确的。我仍然不确定你的问题是什么。第二个和第四个例子不正确。在第二个示例中,4应该是最开始的,因为您正在分区,所有大于它的内容都会向右移动。第一个示例的结果完全相同,第二个示例的结果现在是
4859
,这正是您在聊天中要求的结果。我已经标记了这个问题,并建议你重写它,以便更清楚地知道你想要什么,而不是得到什么。是的,第二个问题你是对的,我的错。所以它只是第一个,返回8459,但应该返回4589,甚至5489。我想我的描述很清楚。“小于的项向左移动,大于的项向右移动。”linkedlist.partition(8)无法返回“8459”,我在说明中解释了这一点。我还提到,我尝试了你的建议,但没有成功,在你建议我尝试之后,情况仍然如此。少于8项的项目需要转到左侧。不过,我会说得更清楚。
greaterThanVal.addToTail(val);
while (iterator) {
    if (iterator.val < val) {
      lesserThanVal.addToTail(iterator.val);
    } else if (iterator.val > val) {
      greaterThanVal.addToTail(iterator.val);
    }
    iterator = iterator.next;
  }

  //now merge them.
  if (lesserThanVal.head === null) {   
    return greaterThanVal;
  } else {
    var pointer = lesserThanVal.tail;
    pointer.next = greaterThanVal.head;
    lesserThanVal.tail = greaterThanVal.tail;
    return lesserThanVal;
  }
}