算法面试题

leetcode中141. 环形链表

标记法
给遍历过的节点打记号,如果遍历过程中遇到有记号的说明已环🤓
 

const hasCycle = function(head) {
  while (head) {
    if (head.tag) {
      return true;
    }
    head.tag = true;
    head = head.next;
  }
  return false;
};

每个被访问过的节点都保存于数组中,在每次访问一个节点的时候与数组内已访问的节点比对,若已经存在,则有环
若最终访问完链表退出循环,则说明无环 

var hasCycle = function(head) {
    let arry = [];
    while(head){
        if(arry.includes(head)) return true;
        else {
            arry.push(head);
            head = head.next;
        }
    }
    return false;
};

将数组转成树结构

const arr = [
    {id: 1, name: '部门A', parentId:0},
    {id: 2, name: '部门B', parentId:1},
    {id: 3, name: '部门C', parentId:1},
    {id: 4, name: '部门D', parentId:2},
    {id: 5, name: '部门E', parentId:2},
    {id: 6, name: '部门F', parentId:3},
]
function covert(arr) {
    let mapTree = new Map;
    let root = null;
    for(let item of arr) {
        let {id, parentId, name} = item;
        let treeNode = {id, name} // 地址不变 但是内容会变
        mapTree.set(id, treeNode); 
        let parentNode = mapTree.get(parentId)
        if(parentNode) {
            if(!parentNode.children) parentNode.children = [];
            parentNode.children.push(treeNode)
        }
        if(parentId == 0) {   
            root = treeNode
        }
    }
    return root
}

 将树转成数组结构(注意结果要求是广度还是深度的)

let tree = [
    {
      id: "1",
      name: "节点1",
      children: [
        {
          id: "1-1",
          name: "节点1-1",
        },
      ],
    },
    {
      id: "2",
      name: "节点2",
      children: [
        {
          id: "2-1",
          name: "节点2-1",
        },
        {
          id: "2-2",
          name: "节点2-2",
          children: [
            {
              id: "2-2-1",
              name: "节点2-2-1",
            },
          ],
        },
      ],
    },
    {
      id: "3",
      name: "节点3",
    },
  ];
// 深度优先遍历 比较简单
function covert(arr, newArr = []) {
  for(let obj of arr) {
    newArr.push({ id: obj.id, name: obj.name });
    if (obj.children) {
        covert(obj.children, newArr);
      }
  }
  return newArr;
}
console.log(covert(tree));


// 广度优先遍历 复杂一些
var arr = [];
function covert(data) {
  for (var i = 0; i < data.length; i++) {
    arr.push({id: data[i].id , name: data[i].name});
    if (data[i].children) {
      data.push(...data[i].children); // 入队 这个方法很巧妙
    }
  }
  return arr;
}
console.log(covert(tree))

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值