双指针:快慢指针。
快指针在每一步走的步长要比慢指针一步走的步长要多。快指针一般的步速是慢指针的2倍。html
在循环中的指针移动一般为:
faster = faster.next.next; slower = slower.next;
node
是否有环:快慢指针思想,注意循环条件:(fast != null) && (fast.next != null)
spring
寻找环的入口:快慢指针相遇的时候,distance(fast指针) = 2 * distance(slow指针)
,能够推导出,只要把fast
从新指向头结点,两个指针以同样的速度走,相遇的时候,即是环的入口。数组
范围的寻找,用2个指针:start
,end
来记录范围。注意循环条件和判断条件:(end + 1 < len) && (nums[end + 1] == nums[end] + 1)
函数
Sorted List I
用两个指针一前一后指向链表。维护两个指针:指针
tail
一个指向当前不重复的最后一个元素,pCur
一个进行依次扫描,遇到不重复的则更新第一个指针,继续扫描,不然就把前面指针指向当前元素的下一个(即把当前元素从链表中删除)。Sorted List II
维护两个指针:code
prev
前驱指针指向上一个不重复的元素pCur
遍历指针Sorted List I
,细节更多。pCur.next != null && prev.next.val == pCur.next.val
Array
数组中的解题思想同样:htm
index
指向上当前不重复的最后一个元素i
遍历数组题目中含有:倒数第n个,那么设置快指针步长为n,而后快慢指针同时以同一速度走,用慢指针寻找倒数第n个blog
给定一个x的值,小于x都放在大于等于x的前面,而且不改变链表之间node原始的相对位置。example中 4->3->5都是大于等3的数,这保持了他们原来的相对位置。leetcode
使用链表最经常使用的双指针:
思路:
1.利用快慢两个指针将链表一分为二;
2.针对第二个子链表求倒序;
3.利用merge思想将两个子链表合并。
faster.next!=null && faster.next.next!=null
Two Pointers
的思想。链表注意构建dummy
头结点。在Java中,因为没有free
函数,因此在删除一个节点的时候,没法用node = null
来删除一个节点,须要用前一个节点来指向删除节点的下一个prev.next = node.next
这样来删除node
节点。