目录
5.栈与队列
1.判断链表中是否有环
// 链表:list.next 表示下一个节点; list.val表示该节点的数据
function hasCycle (head) {
let first = head
let sec = head
while (first && first.next) {
first = first.next.next
sec = sec.next
if (first == sec) {
// 比较节点相等,不能比较数据相等(链式结构)
return true
}
}
// 没有环
return false
}
2.二叉树的先序,中序,后序遍历
- 先序----遍历顺序 根 左子树 右子树
- 中序----遍历顺序 左子树 根 右子树
- 后续---遍历顺序 左子树 右子树 根
function threeOrders( root ) {
// write code here
// 先序遍历---先遍历根在遍历左子树再遍历右子树
let preArr=[]
function preSort(root){
// 递归边界---root不为空
if(root){
preArr.push(root.val)
preSort(root.left)
preSort(root.right)
}
}
// 中序遍历---先遍历左子树,再遍历根在遍历右子树
let midArr=[]
function midSort(root){
// 递归边界---root不为空
if(root){
midSort(root.left)
midArr.push(root.val)
midSort(root.right)
}
}
// 中序遍历---先遍历左子树,再遍历根在遍历右子树
let aftArr=[]
function aftSort(root){
// 递归边界---root不为空
if(root){
aftSort(root.left)
aftSort(root.right)
aftArr.push(root.val)
}
}
preSort(root)
midSort(root)
aftSort(root)
return [preArr,midArr,aftArr]
}
3.最长公共前缀
字符串.substr(下标,字符串长度)
function longestCommonPrefix (strs) {
// write code here
if (strs.length == 0 || strs[0] == '') {
return ''
}
for (let i = 1; i < strs.length; i++) {
if (strs[i].indexOf(strs[0]) != 0) {
// 字符串i不包含字符串0
strs[0] = strs[0].substr(0, strs[0].length - 1)
i--
}
}
return strs[0]
}
4.二分查找
前提:数据有序!
<script>
/*请实现有重复数字的升序数组的二分查找
给定一个 元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1*/
function search (nums, target) {
let left = 0
let right = nums.length - 1
while (left <= right) {
let mid = Math.floor((left + right) / 2)
if (nums[mid] === target) {
// 判断前面还有没有此数据
while (mid != 0) {
if (nums[mid - 1] !== target) {
return mid
} else if (nums[mid - 1] == target) {
mid--
}
}
return 0
} else if (nums[mid] < target) {
left = mid + 1
} else if (nums[mid] > target) {
right = mid - 1
}
}
return -1
}
console.log(search([1,1,2,3,7,7,7,9,9,10], 2))
</script>
5.栈与队列
// 栈是先进后出,队列是先进先出
let arr1 = [] // 第一个栈用来存储数据
let arr2 = [] // 第二个栈用来换数据
// 增加数据--直接添加
function push (node) {
arr1.push(node)
}
// 删除数据---先倒序添加进arr2,再删除
function pop () {
if ((arr1.length == 0)) {
return
}else{
while (arr1.length) {
arr2.push(arr1.pop())
}
let flag = arr2.pop() // 删除1位
while (arr2.length) {
arr1.push(arr2.pop())
}
return flag
}
}