java链表的常见简单面试算法题详解
java链表的常见面试算法题
头插法、尾插法
头插法:先待插入指向头结点的next,后头结点的next指向待插入。
尾插法:借助尾指针,直接插入
/** * 头插法 * @param head * @return */ public static Node head_insert(Node head, int t){ Node node=new Node(t); node.setNext(head.getNext()); head.setNext(node); return head; } /** * 尾插法 * @param head * @return */ public static Node tail_insert(Node head,int t){ Node tail=head; Node target=new Node(t); while (tail.getNext()!=null){ tail=tail.getNext(); } tail.setNext(target); return head; } }
单链表翻转
力扣:LCR 024. 反转链表
将翻转前的链表记pre,翻转后的记next(也是head)。结点依次翻转。
class Solution { public ListNode reverseList(ListNode head) { ListNode pre=null;ListNode next=null; while (head!=null){ next=head.next; head.next=pre; pre=head; head=next; } return pre; } }
链表成环判断
力扣:141. 环形链表
定义两个指针slow、fast,slow走一步,fast走两步遍历链表。相遇就有环
public class Solution { public boolean hasCycle(ListNode head) { ListNode slow=head; ListNode fast=head; while(fast!=null&&fast.next!=null){ fast=fast.next.next; slow=slow.next; if(slow==fast){ return true; } } return false; } }
链表成环位置判断
力扣:LCR 022. 环形链表 II
(1)定义一个A指针(指向开始点A)、B指针(指向相遇点B)。以相同速度移动,相遇点就是环的入口。
public class Solution { public ListNode detectCycle(ListNode head) { Boolean result=false; ListNode slow=head; ListNode fast=head; while (slow!=null&&fast!=null&&fast.next!=null){ slow=slow.next; fast=fast.next.next; if(slow==fast){ result=true; break; } } if(result==false){ return null; } slow=head; while (slow!=fast){ slow=slow.next; fast=fast.next; } return slow; } }
(2)为什么慢指针和快指针相遇时一定没走完一圈?
将环平铺展开,假设慢指针走完一圈了,快指针走两圈的距离。在下图中看出快指针已经超过了慢指针,中途一定有相遇的瞬间。
链表成环长度判断
在上一题找到环入口的前提下,再定义一个指针,绕一圈环并记数。
有序链表的合并
力扣:21. 合并两个有序链表
定义一个pre指针,始终指向已经排好序的链表尾结点。定义一个虚拟节点作为pre的初始节点。
依次遍历两个链表取出小的那个结点作为pre的下一个结点。
class Solution { public ListNode mergeTwoLists(ListNode list1, ListNode list2) { ListNode head=new ListNode(0); ListNode pre=head; while(list1!=null&&list2!=null){ if(list1.val<list2.val){ pre.next=list1; pre=list1; list1=list1.next; }else{ pre.next=list2; pre=list2; list2=list2.next; } } if(list1==null){ pre.next=list2; }else{ pre.next=list1; } return head.next; } }
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。
相关文章
java中排序报:Comparison method violates its general contract异常的解
这篇文章主要给大家介绍了关于java中排序报:Comparison method violates its general contract异常的解决方法,文中介绍的非常详细,对大家具有一定的参考学习价值,需要的朋友们下面来一起看看吧。2017-06-06java8列表中通过stream流根据对象属性去重的三种方式
这篇文章主要介绍了java8列表中通过stream流根据对象属性去重的三种方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教2024-08-08springboot与mybatis整合实例详解(完美融合)
大家都知道springboot搭建一个spring框架只需要秒秒钟。下面通过实例代码给大家介绍一下springboot与mybatis的完美融合,非常不错,具有参考借鉴价值,感兴趣的朋友一起看看吧2016-09-09springboot + vue 实现递归生成多级菜单(实例代码)
这篇文章主要介绍了springboot + vue 实现递归生成多级菜单,本文通过实例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下2019-12-12
最新评论