如何在javascript中实现漂亮的打印循环双向链表?

时间:2016-09-06 23:57:58

标签: javascript node.js data-structures pretty-print

我在javascript中实现了一个双向链接列表,但是,我无法在nodejs中打印出我的结果。我是那些喜欢想象事物以充分理解它们的人之一。我使用了来自npm的prettyjson模块来测试我的单个LL结果,这个结果很好但是因为数据结构是循环的,所以它会引发双重LL的最大堆栈错误。只是想知道,有没有更好,更准确地测试抽象数据结构的工具或最佳实践?

更具体地说,由于数据结构我正在测试循环,因此我无法在终端(nodejs env)中直观地看到我的结果。 我已经尝试过prettyjson模块,但它会抛出“达到最大调用堆栈大小”错误。 我想探索其他在nodejs中打印结果的方法,使其在视觉上准确无误。

PS:我想避免实现嵌入在我的对象定义中的自定义打印功能/方法(类/构造函数..但是你想在Javascript中调用它)。

如果它有用,请点击此处

var prettyjson = require('prettyjson');

//Blueprints
function Node(val){
  this.data = val;
  this.next = null;
  this.prev = null;
}

function DoublyList(){
  this._length = 0;
  this.head = null;
  this.tail = null;
}

//Adds to the list
DoublyList.prototype.add = function(val){
  var node = new Node(val);

  if(this._length){
    this.tail.next = node;
    node.prev = this.tail;
    this.tail = node;
  }else{
    this.head = node;
    this.tail = node;
  }

  this._length++;
  return node;
}

var doublyList = new DoublyList();

doublyList.add(5);
doublyList.add(10);
doublyList.add(15);
doublyList.add(20);
doublyList.add(25);

console.log(doublyList);

1 个答案:

答案 0 :(得分:0)

如果您正在尝试测试您的实现,那么您几乎肯定会不得不处理一些相当混乱的输出,因为我无法看到在命令上可视化的好方法线。如果您只是想象列表中的内容,那么它与您在普通列表中的行为并没有什么不同;循环遍历列表并打印每个元素。例如:

function printList(doublyList) {
    var nodes = [];
    for (var n = doublyList.head; n != null; n = n.next) {
        nodes.push(n.data);
    }
    console.log(nodes.join('<=>'));
}

有关更详细的调试信息,您可以在两个方向添加链接:

function debugPrintList(doublyList) {
    var nodes = [];
    for (var n = doublyList.head; n != null; n = n.next) {
        var nextData = n.next ? n.next.data : 'undefined';
        var previousData = n.prev ? n.prev.data : 'undefined';
        nodes.push('[data: ' + n.data + '; next: ' + nextData + '; prev: ' + prevData + ']');
    }
    console.log(nodes.join('\n'));
}

或者你更喜欢输出它。

我不知道会自动为您执行此操作的库函数,但正如您所看到的那样,自己动手并不会过于复杂。