快慢指针到底指向哪?这个问题对于刚接触这种技巧的人来说往往把握不好.下面将以单链表为例, 说一点我个人的理解.
1) 比较通用的写法
if (head == NULL || head->next == NULL) return true; ListNode *fast = head, *slow = head, *prev = NULL; while (fast && fast->next) { prev = slow; slow = slow->next; fast = fast->next->next; }</span>
while循环的结束条件分析:
fast == NULL 偶数(链表元素个数) ******|s***** slow指向后半部分的第一个元素
fast->next == NULL 奇数 *****|s|***** slow指向正中位置
有时候需要指向第一个部分最后一个位置,比如分割链表. 这需要添加一个prev记录slow的前一个元素.有没有不需要加prev的呢?
我们可以对这种方法稍微变形.
2) 稍微的变形
if (head == NULL || head->next == NULL) return true; ListNode *fast = head, *slow= head; while(fast->next && fast->next->next){ slow = slow->next; fast = fast->next->next; }</span>
while循环的结束条件分析:
fast->next == NULL 奇数 ****s|*|*****
fast->next->next == NULL 偶数 ****s|*****
slow总是指向第一部分的最后一个元素.
这种方法与第一种方法相比,在while循环中多探测了一个深度,因此提前一步结束循环.即slow指针少走了一步.
版权声明:本文为博主原创文章,未经博主允许不得转载。
时间: 2024-10-06 14:35:43