持续创作,加速成长!这是我参与「掘金日新计划 · 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环境调试不熟练,仍需学习。