两种解法
第一种是通过遍历求指针长度,然后利用指针长度除以2直接求中间节点的数值。
struct ListNode* middleNode(struct ListNode* head){
int s=0;//s为链表总长度
struct ListNode* a=head;//定义指针a到头指针上
while(a!=NULL){//遍历链表求长度
s++;
a=a->next;
}
a=head;
for(int i=0;i<s/2;i++)//链表总长度除以2即可求得中间结点值
a=a->next;
return a;
}
做法比较传统朴素。
第二种是通过快慢指针把快指针设置为进度是慢指针的两倍。
当快指针到末尾时,慢指针正好在中间结点上。
struct ListNode* middleNode(struct ListNode* head){
struct ListNode *low=head;//定义慢指针
struct ListNode *fast=head;//定义快指针
while(fast!=NULL&&fast->next!=NULL){
low=low->next;
fast=fast->next->next;//快指针走的始终都是慢指针的两倍
}//因为快指针走的是两倍长度,所以到结点是慢指针整好为中心点
return low;
}