【问题标题】:partitioning a linkedlist in javascript在javascript中对链表进行分区
【发布时间】:2016-02-16 09:30:13
【问题描述】:

我正在尝试对链表进行分区,但当没有任何元素小于您正在查看的当前值时,它似乎无法正常工作。这个想法是基于 val 的,小于参数值的项目在链表中向左移动,大于参数值的项目向右移动。我更改了一些添加到“greaterThan”和“lessThan”链表的条件,但是如果项目在中间,它将停止工作。我错过了什么?一直坚持这一点。这里最相关的功能是“分区”功能,其他都是辅助功能。

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

测试:

    var list = new LinkedList();
    list.addToTail(8);
    list.addToTail(4);
    list.addToTail(5);
    list.addToTail(9);




 console.log(list);
    var partitionedList = list.partition(8); 
    returns { head: { val: 4, next: { val: 5, next: [8...] } },
      tail: { val: 9, next: null } }
    var partitionedList = list.partition(4); 
    returns { head: { val: 8, next: { val: 4, next: [5...] } },
      tail: { val: 9, next: null } }
    var partitionedList = list.partition(9); 
    returns { head: { val: 8, next: { val: 4, next: [{5...}] } },
      tail: { val: 9, next: null } }
    var partitionedList = list.partition(5);
    returns { head: { val: 4, next: { val: 8, next: [{5....}] } },
      tail: { val: 9, next: null } }
    console.log(partitionedList);

小提琴:https://jsfiddle.net/e76vcwtp/

【问题讨论】:

  • 谢谢,现在就这样做
  • 测试你的小提琴,我找不到任何问题。您能否包含预期输出和控制台输出的示例?
  • 是的,我提供了在 JS fiddle 的底部,见 cmets:jsfiddle.net/e76vcwtp/1
  • 所有提供的例子都是正确的。我仍然不确定你的问题是什么。
  • 第二个和第四个例子不正确。在第二个例子中 4 应该在最开始,因为你正在分区,所有大于它的东西都向右

标签: javascript algorithm data-structures linked-list


【解决方案1】:

就您编写的代码而言,您获得的结果是正确的,但是要获得所需的顺序,您只需将 = 符号移到小于一侧。

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

【讨论】:

  • 第一个结果是8459,第二个结果现在是4859,这正是你在聊天中要求的。我已经标记了这个问题,并建议您重写它以更清楚地了解您想要什么与得到什么。
  • 是的,你说的第二个是对的,我的错。所以它只是第一个,它返回 8459,但应该返回 4589 甚至 5489
  • 我想我的描述很清楚。 “小于左边的项目,大于右边的项目。” linkedlist.partition(8) 无法返回“8459”,我在描述中对此进行了解释。我还提到我尝试了您的建议但没有奏效,在您提出我尝试的建议后仍然如此。小于 8 的项目需要向左移动。不过,我会把它说得更清楚。
【解决方案2】:

在分区或合并列表时,您并没有真正很好地处理分区点。 a)你在分区时迭代它 b)将列表重新合并在一起时您不处理它

这也引出了一个问题,如果您选择了一个不在列表中的分区点会发生什么。

处理您现在拥有的而不考虑不在列表中的点的一种方法是从您的分区点开始 GreaterThanVal,在分区期间不要考虑您的分区点,然后只要 lesserThanVal 不是就合并两个列表空。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多