Java算法
JavaRecord
这个作者很懒,什么都没留下…
展开
-
Java算法——15翻转栈的所有元素
题目描述翻转(颠倒)栈的所有元素,如输入栈{1,2,3,4,5}。其中,1在栈顶,翻转之后的栈为{5,4,3,2,1},5处在栈顶解题思路申请额外的队列递归import java.util.Stack;public class Test15 { /**把栈底元素移动到栈顶*/ private static void move_bottom_to_top(Stack<Integer>s){ if(s.empty()){ re原创 2020-08-24 16:01:19 · 362 阅读 · 0 评论 -
Java算法——14实现队列
题目描述实现一个队列的数据结构,使其具有入队列、出队列、查看队列首尾元素、查看队列大小等功能方法一:数组实现import java.util.ArrayList;class MyQueue<T>{ private ArrayList<T>arr=new ArrayList<>(); /**队列头*/ private int front; /**队列尾*/ private int rear; public MyQ原创 2020-08-24 16:00:34 · 152 阅读 · 0 评论 -
Java算法——13实现栈
题目描述实现一个栈的数据结构,使其具有以下方法:压栈、弹栈、取栈顶元素、判断栈是否为空以及获取栈中元素个数。方法一:数组实现数组实现栈,栈空间是一段连续的空间。import java.util.ArrayList;class MyStack<T> { private ArrayList<T>arr; /**数组中存储元素的个数*/ private int stackSize; public MyStack(){ //初始原创 2020-08-24 15:58:45 · 180 阅读 · 0 评论 -
Java算法——12展开链接列表
文章目录题目描述解题思路题目描述给定一个有序链表,其中每个结点也表示一个有序链表,结点包含两个类型的指针:(1)指向主链表中下一个结点的指针(下面代码中称为“正确”指针)(2)指向此结点头的链表(下面代码中称为“down”指针)所以链表都被排序。如:3 → 11 → 15 → 30↓ ↓ ↓ ↓6 21 22 39 ↓ ↓ ↓ 8 50 40↓ ↓ 31 55实现一个函数flatten(原创 2020-08-23 16:15:15 · 197 阅读 · 0 评论 -
Java算法——11判断两个单链表(无环)是否交叉
文章目录题目描述解题思路算法性能分析题目描述单链表相交指的是两个链表存在完全重合的部分,如下:在上图中,这两个链表相交于结点5,要求判断两个链表是否相交,如果相交,找出相交处的结点。解题思路方法一:Hash法如果两个链表相交,那么它们一定会有公共结点,由于结点的地址或引用可以作为结点的唯一标识,因此,通过判断两个链表中的结点是否有相同的地址或引用来判断链表是否相交。首先遍历链表h1,把遍历到的所有结点的地址存放到HashSet中;接着遍历链表h2,每遍历一个结点,就判断这个结点的地址是否原创 2020-08-23 16:13:44 · 531 阅读 · 0 评论 -
Java算法——10在给定单链表中某个结点的指针的情况下删除该结点
文章目录题目描述解题思路算法性能分析题目描述假设给定链表1→2→3→4→5→6→7中指向第5个元素的指针,要求把结点5删掉,删除后链表变为1→2→3→4→6→7。解题思路要删除单链表中的一个结点p,首先需要找到结点p的前驱结点pre,然后通过pre.next=p.next来实现对结点p的删除。此题由于无法获取结点p的前驱结点,所以不能采用这种传统的方法。(1)如果该结点为链表最后一个结点,则无法删除这个结点(2)如果不是最后一个结点,则可以通过把其后继结点的数据复制到当前结点中,然后用删除后继结原创 2020-08-23 16:12:03 · 418 阅读 · 0 评论 -
Java算法——9合并两个有序链表
文章目录题目描述解题思路算法性能分析题目描述已知两个链表head1、head2各自有序(如升序排列),请把它们合并为一个链表,要求合并后的链表依然有序。解题思路分别用指针head1、head2来遍历两个链表,如果当前head1指向的数据小于head2指向的数据,则将head1指向的结点归入合并后的链表中,否则将head2指向的结点归入合并后的链表中。如果有一个链表遍历结束,则把未结束的链表连接到合并后的链表尾部。class LNode { /** * 数据域 */原创 2020-12-18 21:33:34 · 287 阅读 · 0 评论 -
Java算法——8把链表以K个结点为一组进行翻转
文章目录题目描述解题思路算法性能分析题目描述K链表翻转是指把每K个相邻的结点看成一组进行翻转,如果剩余结点不足K个,则保持不变。假设给定链表1→2→3→4→5→6→7和一个数K,如果K的值为2,那么翻转后的链表为2→1→4→3→6→5→7。如果K的值为3,那么翻转后的链表为3→2→1→6→5→4→7.解题思路首先把前K个结点看成一个子链表,将其进行翻转,把翻转后的子链表链接到头结点后面,然后把接下来的K个结点看成另外一个单独的链表进行翻转,把翻转后的子链表链接到上一个已经完成翻转的子链表的后面。当K原创 2020-12-18 21:33:24 · 440 阅读 · 0 评论 -
Java算法——7把链表相邻元素翻转(交换值法、就地逆序)
文章目录题目描述方法一:交换值法方法二:就地逆序算法性能分析题目描述把链表相邻元素翻转,如给定链表为1→2→3→4→5→6→7,则翻转后的链表为2→1→4→3→6→5→7方法一:交换值法最容易想到的方法就是交换相邻两个结点的数据域,这种方法由于不需要重新调整链表的结构,因此比较容易实现,但是这种方法并不是考官所期望的解法方法二:就地逆序主要思路:通过调整结点指针域的指向来直接调换相邻的两个结点。如果单链表恰好有偶数个结点,那么只需要将奇偶结点对调即可,如果链表有奇数个结点,那么只需要将除了最后一原创 2020-12-18 21:33:14 · 656 阅读 · 0 评论 -
Java算法——6检测一个较大的单链表是否有环(蛮力法、快慢指针遍历法)
文章目录题目描述方法一:蛮力法方法二:快慢指针遍历法引申:如果链表存在环,那么如何找到环的入口点?算法性能分析题目描述单链表有环指的是单链表中某个结点的next域指向链表中在它之前的某一个结点,这样在链表的尾部形成了一个环形结构。如何判断单链表是否有环存在?方法一:蛮力法定义一个HashSet用来存放结点的引用,并将其初始化为空,从链表的头结点开始向后遍历,没遍历到一个结点就判断HashSet中是否有这个结点的引用。如果没有,说明这个结点是第一次访问,还没有形成环,那么将这个结点的引用添加到Hash原创 2020-12-18 21:33:03 · 324 阅读 · 0 评论 -
Java算法——5找出单链表中的倒数第k个元素(遍历两次法、快慢指针法)
文章目录题目描述方法一:顺序遍历两遍法方法二:快慢指针法算法性能分析题目描述找出单链表中的倒数第k个元素,如给定单链表:1→2→3→4→5→6→7,则单链表的倒数第k=3个元素为5.方法一:顺序遍历两遍法主要思路:首先遍历一遍单链表,求出整个单链表的长度n,然后把求倒数第k个元素转换为求顺数第n-k个元素,再去遍历一次单链表就可以得到结果。需要遍历两次单链表方法二:快慢指针法由于单链表只能从头到尾依次访问链表中的各个结点,因此如果要找单链表的倒数第k个元素,也只能从头到尾进行遍历查找。在查找过程原创 2020-12-18 21:32:53 · 547 阅读 · 0 评论 -
Java算法——4对链表进行重新排序
文章目录题目描述解题思路算法性能分析题目描述给定链表L0→L1→L2→…→Ln-1→Ln,把链表重新排序为L0→Ln→L1→Ln-1→L2→Ln-2…。要求:①在原来链表的基础上进行排序,即不能申请新的结点;②只能修改结点的next域,不能修改数据域。解题思路(1)首先找到链表的中间结点(2)对链表的后半部分子链表进行逆序(3)把链表的前半部分子链表与逆序后的后半部分子链表进行合并,合并的思路是:分别从两个链表各取一个结点进行合并。class LNode { /** * 数原创 2020-12-18 21:32:43 · 463 阅读 · 1 评论 -
Java算法——3计算两个单链表所代表的数之和(整数相加法、链表相加法)
文章目录题目描述方法一:整数相加法方法二:链表相加法算法性能分析题目描述给定两个单链表,链表的每个结点代表一位数,计算两个数之和。例如,输入链表(3→1→5)和链表(5→9→2),输出:8→0→8,即513+295=808,注意个位数在立链表头。方法一:整数相加法主要思路:分别遍历两个链表,求出两个链表所代表的整数的值,然后把这两个整数进行相加 ,最后把它们的和用链表的形式表示出来。这种方法的优点是计算简单,缺点是:当链表所代表的数很大时(超出了long int的表示范围),就无法使用这种方法了。原创 2020-12-18 21:32:34 · 765 阅读 · 0 评论 -
Java算法——2从无序单链表中移除重复项(双重循环、递归法)
文章目录题目描述方法一:顺序删除算法性能分析方法二:递归法算法性能分析方法三:空间换时间题目描述给定一个没有排序的链表,去掉其重复项,并保留原顺序,如链表1→3→1→5→5→7,去掉重复部分后为1→3→5→7。方法一:顺序删除主要思路:通过双重循环直接在链表上执行删除操作。外层循环用一个指针从第一个结点开始遍历整个链表,然后内层循环用另外一个指针遍历其余结点,将与外层循环遍历到的指针所指结点的数据域相同的节点删除。class LNode { /** * 数据域 */原创 2020-12-18 21:32:23 · 539 阅读 · 0 评论 -
Java算法——1实现单链表的逆序(就地逆序、递归法、头插法)
文章目录题目描述解题思路方法一:就地逆序算法性能分析方法二:递归法算法性能分析方法三:插入法算法性能分析题目描述给定一个带头结点的单链表,请将其逆序。即如果单链表原来为head→1→2→3→4→5→6→7,则逆序后变为head→7→6→5→4→3→2→1。解题思路由于单链表与数组不同,单链表中每个结点的地址都存储在其前驱结点的指针域中,因此,对单链表中任何一个结点的访问只能从链表的头指针开始进行遍历。在对链表的操作过程中,需要特别注意在修改结点指针域的时候,记录下后继结点的地址,否则会丢失后继节点。原创 2020-12-18 21:32:00 · 2214 阅读 · 1 评论