今天在刷leetcode的题目 Palindrome Linked List的时候,想出来的解决算法的空间复杂度都在O(n),不符合题目的限制,在看了几个博客以后发现他们的解决方案都用到了一个方法查找链表的中点:
快慢指针找链表中点法
算法的思路是:
定义一个快指针fast 一个慢指针slow ,快指针一次移动两个结点,慢指针一次移动一个结点
当fast到达链表的尾部结点时,慢指针也就移动到了链表的中间结点(同化成一个路程问题,同一段路程,A的速度是B的两倍,他们同时出发,当A走完全程时,B也就刚好走过一半)
代码如下:
while(fast&&fast->next) //条件一个都不能少,因为链表节点个数可能为为奇数或偶数
{
slow=slow->next;
fast=fast->next->next;
}
如果结点个数是偶数个的话,slow指向中间两个元素的右边那个