
思路一:常规解法
最容易想到的思路当然就是先遍历一遍链表,记下链表的长度,然后再遍历到链表的中间值,最后返回该节点的地址。
如下:
struct ListNode* middleNode(struct ListNode* head) {
int count=0;
struct ListNode*tmp=(struct ListNode*)malloc(sizeof(struct ListNode));
tmp->next=head;
while(tmp->next!=NULL){
count++;
tmp->next=tmp->next->next;
}
count=count/2;
tmp->next=head;
while(count>0){
tmp->next=tmp->next->next;
count--;
}
return tmp->next;
}
思路二:快慢指针法、
定义两个指针,一开始都指向头节点,慢指针每次向后移动一位,快指针每次向后移动两位,这样当快指针指向链表末尾时,慢指针刚好指向链表的中间节点。
如下:
struct ListNode* middleNode(struct ListNode* head) {
struct ListNode*fast=head;
struct ListNode*slow=head;
while(fast&&fast->next){
slow=slow->next;
fast=fast->next->next;
}
return slow;
}
注意: while(fast&&fast->next)中的判断条件不能反过来写(fast->next&&fast)
如下图,当链表节点数为偶数时,fast指针最后会指向空,而空指针解引用会报错

是不是感觉用这种方法写出来的代码更加简洁漂亮了呢,而且运行效率也更高了。
1022

被折叠的 条评论
为什么被折叠?



