携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第20天,点击查看活动详情
一、题目描述:
给定一个头结点为 head 的非空单链表,返回链表的中间结点。
如果有两个中间结点,则返回第二个中间结点。
示例 1:
输入:[1,2,3,4,5]
输出:此列表中的结点 3 (序列化形式:[3,4,5])
返回的结点值为 3 。 (测评系统对该结点序列化表述是 [3,4,5])。
注意,我们返回了一个 ListNode 类型的对象 ans,这样:
ans.val = 3, ans.next.val = 4, ans.next.next.val = 5, 以及 ans.next.next.next = NULL.
示例 2:
输入:[1,2,3,4,5,6]
输出:此列表中的结点 4 (序列化形式:[4,5,6])
由于该列表有两个中间结点,值分别为 3 和 4,我们返回第二个结点。
提示:
- 给定链表的结点数介于 1 和 100 之间。
二、思路分析:
这道题应该没有头结点吧,头结点应该没有val值,只是next指向链表第一个结点;
然后说思路
一般双指针解法的输出,在结点为偶数个时,取到的是前一个中间结点,输出时需要取next;
如何解决这个问题呢?
经过观察可知,当快指针(代码中的p指针)后移奇数位时,快慢指针同时后移;
当快指针后移偶数位时,快指针后移,而慢指针不动;
我是设置了一个标志位,标志奇偶;
这样,输出时直接输出慢指针所指结点即可。
三、AC 代码:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* middleNode(struct ListNode* head){
int sign=0;
struct ListNode *p=head,*q=head;
while(p->next!=NULL){
if(sign==0){
p=p->next;
q=q->next;
sign=1;
continue;
}
if(sign==1){
p=p->next;
sign=0;
}
}
return q;
}
四、参考: