[链表]leetcode876:链表的中间节点(easy)

题目:
在这里插入图片描述
题解:

  • 思路1:先求出链表的长度,然后求出中位数所在的位置,最后遍历链表找到中位节点即可

  • 思路2:快慢指针,快指针走两步,慢指针走一步,等快指针走到链表尾节点时,慢指针的位置就是中位数的位置

代码如下:

class Solution {
public:
    //题解1:先求出链表的长度,然后求出中位数所在的位置,最后遍历链表找到中位节点即可
    ListNode* middleNode(ListNode* head) {
        /*if(!head)return nullptr;
        int n=0;
        ListNode *p=head;
        while(p){
            ++n;
            p=p->next;
        }
        n=n/2+1;
        while(--n){
            head=head->next;
        }
        return head;*/
        //将上面代码优化,直接将所有节点存放在一个vector中,然后我们返回数组中中位数的值
        vector<ListNode*> middle;
        while (head!=0) {
            middle.push_back(head);
            head = head->next;
        }
        return middle[middle.size()/2];
    }

    //题解2:快慢指针,快指针走两步,慢指针走一步,等快指针走到链表尾节点时,慢指针的位置就是中位数的位置
    ListNode* middleNode_2(ListNode* head){
        ListNode *slow=head,*fast=head;
        //链表长度为奇数时,fast为尾节点,slow为中位数节点
        //链表长度为偶数时,fast为尾后节点(nullptr),slow为后中位数节点
        while(fast&&fast->next){
            fast=fast->next->next;
            slow=slow->next;
        }
        return slow;
    }
};
发布了484 篇原创文章 · 获赞 149 · 访问量 11万+

猜你喜欢

转载自blog.csdn.net/qq_43152052/article/details/103995590