快慢指针在算法题上的应用
来源:互联网 发布:xp下查找网络打印机 编辑:程序博客网 时间:2024/05/18 00:00
最近在刷leetcode oj,在做题过程中发现有很多题目的解法里都用到了快慢指针,之前对这个概念接触很少,所以做以下总结:
首先考虑一个简单的问题,寻找链表的中间节点,这个问题是快慢指针应用的典型问题,java代码段如下:
public ListNode getMid(ListNode head){ ListNode slow = head; ListNode fast = head; while(fast!= null && fast.next != null && fast.next.next !=null ){ slow = slow.next; fast = fast.next.next; } return slow;}
该方法一开始将快慢指针都指向头节点,然后慢指针每次移动一步,快指针一次移动两步,直到快指针到达末尾慢指针的位置就是链表的中间节点位置。
快慢指针还有其它方面的应用,判断链表是否存在环和找出环开始的位置也是快慢指针大显身手的地方,先看判断链表是否存在环的问题,java代码如下:
public boolean hasCycle(ListNode head) { if(head == null || head.next == null) return false; ListNode slow = head; ListNode fast = head; while(fast != null && fast.next != null && fast.next.next != null){ slow = slow.next; fast = fast.next.next; if(slow == fast) return true; } return false;}利用快慢指针,如果链表有环的话,快指针和慢指针肯定会相遇,这跟环型跑道赛跑是一个道理。
在这基础上扩展不难提出这样的问题,如果链表存在环,那么如何找到环的起点,先上java代码:
public ListNode detectCycle(ListNode head) { if(head == null || head.next == null) return null; ListNode slow = head; ListNode fast = head; ListNode begin = null; while(fast != null && fast.next != null && fast.next.next != null){ slow = slow.next; fast = fast.next.next; if(slow == fast){ slow = head; while(slow != fast){ slow = slow.next; fast = fast.next; } begin = slow; break; } } return begin;}思路就是当快慢指针相遇的时候让慢指针指向头节点,快指针变成每次移动一步,当两个指针相遇的时候,那个节点就是环的起点。
具体可以参考以下链接:http://umairsaeed.com/2011/06/23/finding-the-start-of-a-loop-in-a-circular-linked-list/
0 0
- 快慢指针在算法题上的应用
- 快慢指针在链表的应用
- 快慢指针在链表的应用
- 快慢指针在链表的应用
- 快慢指针的应用
- 快慢指针在链表中的应用
- Faster\Slower 快慢指针的应用
- 快慢指针的概念及其应用
- Faster\Slower 快慢指针的应用
- 关于快慢指针的若干应用详解
- 快慢指针及应用
- 快慢指针及其应用
- 快慢指针应用(一)
- 链表快慢指针应用
- leetcode第143题 ( Reorder List),快慢指针的应用
- 证明利用快慢指针寻找有环单链表中环的起点算法
- 算法增长的快慢
- 快慢指针和其简单应用
- bnm,
- zxcvbnm,
- hdu5025 状态压缩搜索 《网络赛题》
- bnm,
- sdfg,.
- 快慢指针在算法题上的应用
- 两个整数变量的值互换!
- 安装Oracle 11g+warehouse
- IOS中nil/Nil/NULL的区别
- 十一国庆节美丽日记365优惠大放送促销活动开始啦!
- linux的常见帮助命令和用户管理命令
- 认识WRK
- android-修改TextView中部分文字的颜色
- Delphi, Firebird, IBObjects and Transaction Management