876.链表的中间节点

leetcode中的head节点指的是第一个节点。

题目描述:

给定一个头结点为 head 的非空单链表,返回链表的中间结点。

如果有两个中间结点,则返回第二个中间结点了。

我想到的第一个解法:先遍历一遍链表,找到链表长度size,然后用链表长度/2得到中间节点的索引mid(链表长度为奇数或偶数都成立),然后遍历到mid节点返回。

class Solution {
public:
    ListNode* middleNode(ListNode* head) {
        ListNode*cur=head;
        int size=0;
        int mid=0;
        while(cur!=nullptr){
            cur=cur->next;
            size++;
        }
        mid=size/2;
        ListNode*p=head;
        while(mid--){
            p=p->next;
        }
        return p;

    }
};

第二种解法:快慢指针,如何找到中间节点呢,我们让快指针走两步,慢指针走一步,这样当快指针停下来的时候,慢指针指向中间节点。关键是找出快指针停下的条件,这要链表长度分为奇数还是偶数,当是奇数时,fast.next不等于null,当是偶数时,fast不等于null,

class Solution {
public:
    ListNode* middleNode(ListNode* head) {
        ListNode*fast=head;
        ListNode*slow=head;
        while(fast!=nullptr&&fast->next!=nullptr){
            fast=fast->next->next;
            slow=slow->next;            
        }       
        return slow;
    }
};

你可能感兴趣的:(链表,数据结构,leetcode)