前言
leetcode新手村876.链表的中间结点
提示:以下是本篇文章正文内容,下面案例可供参考
一、方法一
第一种方法:
首先遍历一遍链表,记录下节点的数目。再遍历一遍链表,遍历到n/2处停下,即得到链表的中间结点
需要注意的地方就是这个链表是没有一个空的头节点的,头节点直接就是第一个元素
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
method1:先遍历整个单链表,找出长度,/2,可得中间的位置
再从头向后查找/2个
注意:这个是没有头结点的链表
*/
struct ListNode* middleNode(struct ListNode* head){
//struct ListNode * p = head->next;
struct ListNode * p = head;
int n = 0;
while(p != NULL){
n++;
p = p->next;
}
p = head;
for(int i=1; i<=n/2; i++){
p = p->next;
}
return p;
}
二、方法二
定义快慢两个指针,每次快指针走两个节点,慢指针走一个节点,当快指针走到结尾的时候,慢指针正好走到链表的中间。
代码如下(示例):
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
method2:使用快慢两个指针
*/
struct ListNode* middleNode(struct ListNode* head){
struct ListNode *quickP, *slowP;
quickP = head;
slowP = head;
while(quickP != NULL){
quickP = quickP->next;
if(quickP == NULL)
break;
quickP = quickP->next;
slowP = slowP->next;
}
return slowP;
}
总结
没什么好总结的