鏈表的一些小案例
/**
* 構造函數 表示鏈表的一個節點
*
*/
function Node(value){
this.value = 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;
// console.log(a)
/**
* 1.遍歷一個鏈表,打印每個節點的數據
*/
// function parint(root){
// var node = root
// while(node){
// //如果有值就打印
// console.log(node.value);
// node = node.next;
// }
// 分治法
// if(root){
// console.log(root.value);
// parint(root.next);
// }
// }
// parint(a)
/**
* 2.計算鏈表的長度
*/
//第一種
// var num = 0;
// function count(root){
// if(root){
// num++
// count(root.next)
// }
// }
// count(a)
// console.log(num)
// // 第二種
// function count(root) {
// if(!root) return 0;//表示沒有節點
// return 1 + count(root.next) //1表示根節點佔用的一個數量
// }
// console.log(count(b))
/**
*
* 3.得到鏈表某個下標的數據
* @param {*} root
* @param {*} index
*/
// function getValue(root,index) {
// //輔助函數
// function _getValue(node,i){
// //判斷如果鏈表爲空,終止查找
// if(!node) return null;
// if(i == index) return node.value;
// return _getValue(node.next,i+1)
// }
// //鏈表每次查詢都要從頭開始,然後可以遞歸每次加一,知道查詢到
// return _getValue(root,0)
// }
// var result = getValue(a,2)
// console.log(result)
/**
*
*根節點 修改的鏈表數據的下標,要修改成的值
* @param {*} root
* @param {*} index
* @param {*} value
*/
// function setValue(root,index,value){
// //輔助函數
// function _getValue(node,i){
// if(!node) return null;
// if(i == index) {
// node.value = value
// }else{
// _getValue(node.next,i+1)
// }
// }
// _getValue(root,0)
// }
// setValue(a,1,'修改的值')
// console.log(a)
// 在某個鏈表節點之後加入一個新節點
/**
*
*節點,新節點
* @param {*} node
* @param {*} newValue
*/
// function insertAfter(node,newValue){
// //先創建一個節點
// var newNode = new Node(newValue);
// node.next = newNode;
// newNode.next = node.next
// }
// insertAfter(b,"n")
// console.log(a)
// 在鏈表結尾加入新節點
/**
*
*
* @param {*} root
* @param {*} newValue
*/
// function push(root,newValue) {
// //判斷是最後一個節點
// if(!root.next){
// //最後一個節點
// var newNode = new Node(newValue)
// root.next = newNode;
// }
// else {
// push(root.next,newValue); //自己不是最後一個,看下一個
// }
// }
// push(a,'m')
// console.log(a)
/**
*
*根據給定的鏈表,和刪除的值,刪除對應的節點
* @param {*} root
* @param {*} nodeValue
*/
// function removeNode(root,nodeValue){
// if(!root || !root.next) return; // 無法刪除的情況
// if(root.next.value === nodeValue) {
// //下一個節點就是要找的節點1
// root.next = root.next.next;
// }
// else {
// //下一個節點還不是
// removeNode(root.next,nodeValue)
// }
// }
// removeNode(a,'c')
// console.log(a)
//給定一個鏈表,返回一個倒序後的根節點
/**
*
*
* @param {*} root
* @returns
*/
function reverse(root){
//如果都沒有根節點,或者就根節點自己
if(!root || !root.next ) return root;
//鏈表兩個節點
if(!root.next.next){
//保存返回來的1節點
var temp = root.next;
//有兩個節點的鏈表
root.next.next = root;
root.next = null;
return temp
}
else {
//先把後邊節點倒序,分治法
var temp = reverse(root.next);
root.next.next = root;
root.next = null;
return temp
}
}
var temp = reverse(a)
console.log(temp)