码迷,mamicode.com
首页 > 其他好文 > 详细

快慢指针到底指向哪?

时间:2015-08-03 01:19:05      阅读:171      评论:0      收藏:0      [点我收藏+]

标签:单链表   快慢指针   指针   

快慢指针到底指向哪?这个问题对于刚接触这种技巧的人来说往往把握不好.下面将以单链表为例, 说一点我个人的理解.


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指针少走了一步.


版权声明:本文为博主原创文章,未经博主允许不得转载。

快慢指针到底指向哪?

标签:单链表   快慢指针   指针   

原文地址:http://blog.csdn.net/tangchenchan/article/details/47216805

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!