题目链接
解法1:快慢指针
解法一:快慢指针的思想。
定义两个指针,分别为快指针和慢指针(fast和slow),fast每次走两步,而slow每次走一步,关键是走到什么时候结束,只要fast和fast->next不为空,就一直走下去,当fast->next为空时,此时fast已经来到了链表的最后一个节点,由于fast每次走两步,所以slow此时正好处于整个链表的中间位置。(最好可以自己画图来辅助自己思考),无论链表中的结点个数是基数还时偶数,都可以返回符合题目要求的中间结点。
当链表个数为奇数的时候,符合条件。
当链表个数为偶数的时候,也是符合题目的条件。
关于快慢指针的理解:我们单单从快慢指针的字面意思来看也大体可以猜到快慢指针就是一个指针走得快,另一个指针走得慢;事实上快慢指针就是这个意思。
在本题中:快指针fast每次均走两步,而慢指针slow的话每次只能走一步;这样的话快指针的速度就是慢指针速度的二倍;当快指针走完整个元素的时候,此时由于慢指针的速度是快指针速度的一般,所以此时慢指针正好会走到整个链表的中间位置,即此时慢指针指向的是整个链表的中间结点的位置。
解题代码
答案代码:
struct ListNode* middleNode(struct ListNode* head){ struct ListNode* slow,*fast; slow=fast=head; while(fast&&fast->next) { fast=fast->next->next; slow=slow->next; } return slow; }
关于这种题目的解法肯定会有很多中方法,这里的话利用快慢指针就会比较经典的了。至于这道题目的其它解决方法,后面有机会再把这道题的题解来给大家进行一一列举。
好了,就到这里吧,再见啦各位!!!