随笔分类 - 算法题目总结
摘要:一个栈一次压入 1 2 3 4 5 那么从栈顶到栈底分别为 5 4 3 2 1. 将这个栈转置后,从栈顶到栈底为 1 2 3 4 5 实现栈中元素的逆序 要求只能用 递归函数实现 代码: 这个代码是这么理解: 最后一层递归 空的时候 return result=1 last此时就是1了 然后push
阅读全文
摘要:编写一个类,用两个栈实现队列,支持队列的基本操作(add poll peek) 栈的特点是先进后出,而队列是先进先出。用两个栈正好能把顺序反转过来实现类似队列的操作 具体实现: 一个栈作为压入栈,在压入数据时候,在压入数据时只往这个栈中压入,记为 stackPush 另一个栈只作为弹出栈,在弹出数据
阅读全文
摘要:实现一个特殊的栈,在实现栈的基本功能基础上,再实现返回栈中最小元素的操作。 思路: 在设计上 使用两个栈,一个用来保存当前栈中的元素,其功能和一个正常的栈没有区别。记为 stackData 另一个栈用来保存每一步的最小值,这个栈记为 stakMin 压入数据规则: 假设当前数据为 newNum 先将
阅读全文
摘要:给定一棵二叉树的头节点head, 按照两种标准分别实现二叉树边界节点的逆时针打印 标准一 头节点为边界节点 叶节点为边界节点 如果节点在其所在的层中是最左或者最右边,那么也是边界节点 标准二 头节点作为边界节点 叶节点位边界节点 树左边界延伸下去的路径为边界节点 树有边界延伸下去的路径为边界节点
阅读全文
摘要:用递归解决的问题都能用非递归解决 这是因为无非就是利用函数栈来保存信息,如果自己申请的数据结构来代替栈,也可以实现相同功能。 实现非递归的先序遍历: 1 申请一个栈 stack 2 然后将头节点head压入stack 3 从stack中弹出栈顶节点 cur, 打印cur的节点值。 再将cur的右孩子
阅读全文
摘要:递归: 下面用图形的方式解释一下这个递归的执行过程,可能有些同学对于这个过程不是很了解: 如果是这个样子的二叉树: 首先是这样:对于每行逻辑代码 我做了个标记 对于函数的的调用时需要入栈 进栈的
阅读全文
摘要:把链表右边的 拿过来以此插入到左边的链表 思路: 如果链表长度为N,直接给出时间复杂度为O(N) 额外空间复杂度为O(1)的方法 1 如果链表为空,或者长度为1 不调整 2 链表长度大于1时, 遍历一便找到左半区最后一个节点 记为mid
阅读全文
摘要:给定两个有序单链表的头节点head1 和 head2 ,请合并两个有序链表,合并后的链表依然有序,并返回合并后链表的头节点 假设两个链表长度为M和N 直接给出时间复杂度为(M+N) 额外空间复杂度O(1) 1 如果两个链表中一个为空 则无需合并 返回另一个的链表头节点 2 比较head1 和 hea
阅读全文
摘要:题目: 一个环形链表从表头节点head开始不降序,同时由最后的节点指回头节点。给定这样一个环形单链表的头节点和一个整数num,请生成节点值为num的新节点,并插入到这个环形链表中,保证调整后的链表依然有序 时间复杂度O(N) 额外空间复杂度O(1) 的方法 1 生成节点的值为num的新节点, 记为n
阅读全文
摘要:链表节点值类型为int,给定一个链表中的节点node,但不给定头节点,如何在链表中删除node? 你看看代码就知道 这个思想有多么操蛋了哈哈哈哈
阅读全文
摘要:给定一个无序单链表的头节点head,实现单链表的选择排序 要求额外空间复杂度O(1) 思路: 既然额外空间复杂度O(1),就不能把链表装进容器,排好序后再从新链接,而是要求面试者在原链表上利用有限几个变量完成选择排序的过程。 选择排序是从未排序的部分找到最小值,然后放到排好序部分的尾部。 1 开始时
阅读全文
摘要:给定一个链表的头节点head和一个整数num,请实现函数将值num的节点全部删除 方法一 利用栈或者其他容器收集的方法 时间复杂度O(N) 额外空间复杂度O(N) 将值不等于num的节点收集起来!!!哈哈哈哈哈哈哈哈哈哈啊哈哈哈哈啊哈哈 最后将占地的节点作为新的头节点返回 方法二 直接调整 首先从链
阅读全文
摘要:给定一个无序单链表的头节点head,删除其中重复出现的节点 要求: 方法1 长度N 时间复杂度O(N) 方法2 额外空间复杂度O(1) 方法一 1 生成哈希表 头节点是不用删除的节点 所以首先将头放入哈希表 2 从头节点的下一个节点开始往后遍历 cur,检查是否在哈希表中,在则删除,不在 加入 同时
阅读全文
摘要:给定一个单链表的表头节点head,实现一个调整单链表的函数,是的每k个节点之间逆序,如果最后不够k个节点一组,则不调整最后几个节点 思路: 如果k的值小于2,不调整。k<1 没有意义,k==1代表1个节点为1组进行逆序,原链表不变。 介绍两种方法: 方法一 利用栈结构 1、从左到右便利链表,如果栈的
阅读全文
摘要:单链表,可能有环,也可能无环。给定两个单链表的头节点head1 和 head2 这两个链表可能交也可能不交。实现函数,如果相交,请返回相交的第一个节点,不交返回null 这道题目需要分析的情况非常 本题拆分长三个子问题,每一个子问题都可以作为一道独立的算法题。 问题一、 如何判断有环 有则返回第一个
阅读全文
摘要:对于这个问题还有一个很好的方法: 1、将两个链表逆序,这样就可以依次得到从低到高位的数字 2、同步遍历两个逆序后链表,相加生成新链表,同时关注进位 3、当两个链表都遍历完成后,关注进位。 4、 将两个逆序的链表再逆序一遍,调整回去 返回结果链表
阅读全文
摘要:假设链表中每一个节点的值都在0~9之间,那么链表整体就可以代表一个整数 给定两个链表的头节点head1和head2,请生成代表两个整数相加值的结果链表 传统做法 先把链表生成 整数 然后相加 这样的有个溢出问题 介绍一种做法: 利用栈结构求解: 1、 将两个链表分别从左到右遍历,遍历过程中将值压栈,
阅读全文
摘要:一种特殊的链表节点类描述如下: public class Node{ public int value; public Node next; public Node rand; public Node(int data){ this.value = data } } rand指针是Node类中的新增
阅读全文
摘要:给定一个单向链表的头节点head,节点的值是整型,再给定一个整数pivot。实现一个调整函数,左部分<pivot 中间=pivot 右边>pivot,除这个要求外,其他顺序不可改变
阅读全文
摘要:给定一个链表的头节点head,判断是否是回文结构 1->2->1 返回true 进阶: 如果链表长度N,时间复杂度O(N) 额外空间O(1) 方法一 利用栈结构(需要额外空间) 从左到右遍历,一次压栈。 这样的到的 从栈顶到栈底的节点值出现顺序会与原链表从左到右的值出现顺序相反。 废话不多说,上代码
阅读全文