赞
踩
大家好,今天接着给大家带来链表的OJ题,话不多说,咱们往下看:
第一题:链表的中间结点
这题有很多种解法,但是呢,我会给大家将一种比较优的思路,且后面的OJ题也会用到这种思路。
解题思路:
- struct ListNode* middleNode(struct ListNode* head){
- if(head==NULL||head->next==NULL){
- return head;
- }
- struct ListNode* fast=head;
- struct ListNode* slow=head;
- while(fast&&fast->next)
- {
- fast=fast->next->next;
- slow=slow->next;
- }
- return slow;
- }
这题可以用快慢指针的思路来解决,因为这里要我们求中间节点,并返回该节点,我们可以定义两个指针,一个fast和一个slow,让fast每次走两步,slow每次走一步,这样当fast走到NULL的时候slow就是中间节点,但是因为可能节点的个数是偶数,那中间节点就会有两个,但这里要求要返回后面的那个中间节点,先画个图个大家理解一下:
当链表节点数为奇数的时候,我们发现,当slow为中间节点时,fast在最后一个节点
当链表节点个数为偶数时,我们发现slow在中间节点的时候,fast已经走到NULL了
这里要注意的问题有两个: 1、当head为NULL||head->next为NULL时,我们直接返回head即可,因为这时候前者没有节点,后者只有一个节点。
2、while的循环条件,我们必须写成fast&&fast->next,不可写成fast->next&&fast,因为如果写成后者,fast有可能已经走到NULL了,而f
赞
踩
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。