//创建链表
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
}