链表类算法
william_919
这个作者很懒,什么都没留下…
展开
-
[剑指offer] 从尾到头打印链表
题目描述 输入一个链表,按链表值从尾到头的顺序返回一个ArrayList。 解题思路 一种方法是利用栈来实现; 另外一种方法是利用三个指针把链表反转,关键是 r 指针保存断开的节点。 参考代码 /** * public class ListNode { * int val; * ListNode next = null; * * ListNode(...原创 2019-04-22 15:54:58 · 137 阅读 · 0 评论 -
[剑指offer] 反转链表
题目描述 输入一个链表,反转链表后,输出新链表的表头。 解题思路 设置三个指针,head为当前节点,pre为当前节点的前一个节点,next为当前节点的下一个节点,需要pre和next的目的是让当前节点从pre->head->next1->next2变成pre<-head next1->next2的过程中,用pre让节点反转所指方向,next节点保存next1节点防止链...原创 2019-04-22 15:55:58 · 114 阅读 · 0 评论 -
[剑指offer] 链表中倒数第k个结点
题目描述 输入一个链表,输出该链表中倒数第k个结点。 解题思路 经典的双指针法。定义两个指针,第一个指针从链表的头指针开始遍历向前走k-1步,第二个指针保持不动,从第k步开始,第二个指针也开始从链表的头指针开始遍历,由于两个指针的距离保持在k-1,当第一个指针到达链表的尾节点时,第二个指针刚好指向倒数第k个节点。 关注要点 链表头指针是否为空,若为空则直接返回回null k是否为0,k为0也就是...原创 2019-04-22 15:57:10 · 99 阅读 · 0 评论 -
[剑指offer] 合并两个排序的链表
题目描述 输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。 解题思路 两种解法:递归和非递归 参考代码 /* public class ListNode { int val; ListNode next = null; ListNode(int val) { this.val = val; } }*/ /...原创 2019-04-22 15:58:01 · 129 阅读 · 0 评论 -
[剑指offer] 复杂链表的复制
题目描述 输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空) 解题思路 参考代码 /* public class RandomListNode { int label; RandomListNode next = nu...原创 2019-04-23 09:18:00 · 146 阅读 · 0 评论 -
[剑指offer] 链表中环的入口结点
一、运行时数据区域 Java虚拟机管理的内存包括几个运行时数据内存:方法区、虚拟机栈、本地方法栈、堆、程序计数器,其中方法区和堆是由线程共享的数据区,其他几个是线程隔离的数据区 1.1 程序计数器 程序计数器是一块较小的内存,他可以看做是当前线程所执行的行号指示器。字节码解释器工作的时候就是通过改变这个计数器的值来选取下一条需要执行的字节码的指令,分支、循环、跳转、异常处理、线程恢复等基础功能都需...原创 2019-03-29 15:48:05 · 128 阅读 · 0 评论 -
[剑指offer] 两个链表的第一个公共结点
题目描述 输入两个链表,找出它们的第一个公共结点。 解题思路 如果两个链表存在公共结点,那么它们从公共结点开始一直到链表的结尾都是一样的,因此我们只需要从链表的结尾开始,往前搜索,找到最后一个相同的结点即可。但是题目给出的单向链表,我们只能从前向后搜索,这时,我们就可以借助栈来完成。先把两个链表依次装到两个栈中,然后比较两个栈的栈顶结点是否相同,如果相同则出栈,如果不同,那最后相同的结点就是我们要...原创 2019-04-23 09:17:46 · 110 阅读 · 0 评论