數據結構---鏈表小案例

鏈表的一些小案例

/**
 * 構造函數  表示鏈表的一個節點
 * 
 */
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)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章