js递归创建链表实现

183 阅读1分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第5天

第一步:用function定义链表的节点,参数有当前值val和下一个值next,可用点方法获取

/**
 * 
 * @param {*} val 当前节点的值
 * @param {*} next 下一个节点的值
 */
function linkNode(val, next){
    this.val = val;
    this.next = next;
    return this;
}

第二步:将节点连接起来,考虑使用递归,这里有两种思路 思路一:reduce方法

    /**
 * reduce方法递归创建链表
 * @param  {...any} node 按序传入所有节点,生成链表,
 */
function createLinkNodeByReduce(...node){
    let dummy = new linkNode(null,null);
    node.reduce((pre, cur) => {
        pre.val = cur;
        pre.next = new linkNode(null, null);
        return pre.next;
    }, dummy);
    return dummy;
}

思路二更简洁一些,直接使用递归(其实直接使用方法二就可以,方法一算是对reduce函数的一个复习:

 * 常规递归创建链表
 * @param {Array} nodeArr 
 * @returns linkNode
 */
function createLinkNodeByRec(node){
    if(node.length !== 0){
        return new linkNode(node.shift(), createLinkNodeByRec(node));
    }
}

第三步:遍历计算链表长度方法

/**
 * 
 * @param {linkNode} head 
 * @returns length
 */
function getLength(head){
    let length = 0;
    while(head !== undefined&&head.val !== null){
        head = head.next;
        length++;
    }
    return length
}

第四步:输出链表的方法

/**
 * 
 * @param {linkNode} head 
 * @returns str
 */
function showLink(head){
    let resultStr = '';
    let len = getLength(head);
    for(let i = 0;i < len - 1;i++){
        resultStr += (head.val + '->');
        head = head.next;
    }
    return resultStr + head.val;
}

总结反思: 即使有了思路,在练习时,许多地方还是出了问题,例如next指向,以及通过lenth来输出链表全表时没有考虑到随着指针指向的变化,lenth同样也在变化,所以for循环判断出现了问题,比预期循环次数要短,这些都是要多练习多思考多巩固才能有效避免的错误。

同样不足之处还有调试太慢,node环境调试不熟练,仍需学习。