链表
//创建链表 function Node(value){ this.val = value; this.next = null; } var a = new Node('a'); var b = new Node('b'); var c = new Node('c'); a.next = b; b.next = c; //遍历节点 function paint(root){ if(!root){ return null }else{ console.log(root.val) paint(root.next) } } //查找节点个数 function findNodeNum(root){ if(!root) return 0; return 1 + findNodeNum(root.next) } //索引值查找节点 function findIndexVal(root,index){ let i = 0;
let node = root;
while(i < index){
if(!node.next) return null
node = node.next
i++
}
return node.value }
function findIndexValue(root,index,i=0){
if(i === index) return root.value
if(!root.next) return null;
return findIndexValue(root.next,index,i + 1 )
} //改变索引下value属性 function setValue(root,index,value){ function _setValue(node,i){ if(!node)return ; if(index === i){ node.val = value }else{ _setValue(node.next,i + 1) } } _setValue(root,0) }
function setValue(root,index,value,i =0){
if(i === index){
root.value = value
return
}
if(!root.next) throw new Error(`root第${index} 不存在`)
return setValue(root.next,index,value,i + 1 )
} //随机插入节点 function insertNode(node,value){ var newValue = new Node(value); var temp = node.next; newVlaue.next = temp; node.next = newValue } //在节点后添加节点 function insertAfterNode(root,value){ if(!root.next){ var newNode = new Node(value) root.next = newNode }else{ insertAfterNode(node.next,value) } } //删除节点 function removeNode(root,value){ if(root.value === value){
return root.next
}
root.next = removeNode(root.next,value)
return root } //节点反转 function resverNode(root){ let pre = null;
let cur = root;
while(cur){
let temp = cur.next
cur.next = pre
pre = cur
cur = temp
}
return pre
}
//链表中倒数第k个节点
function getKthFromEnd(head,k){
if(!head) return null
let fast = slow = head;
let n = 0;
while(n < k && head){
fast = fast.next;
n++
}
if(n != k) return null
while(fast){
fast = fast.next;
slow = slow.next
}
return slow
}