leetCode第876题<最简单的解法,最容易的解法>

首先,题目是:
876. 链表的中间结点
要求:给定一个带有头结点 head 的非空单链表,返回链表的中间结点。
如果有两个中间结点,则返回第二个中间结点。

示例:输入:[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.

首先我想到的方法是先有一个循环遍历得出链表节点的个数n,然后再判断是技术还是偶数,如果是偶数就输出n/2+1个节点以后的内容,如果是基数的话就输出n/2个节点以后的内容;但是请注意
它这个题目说的是有头节点,但其实是没有头节点的。也就是head节点存了第一个值。因此可以推出
/**

  • Definition for singly-linked list.

  • struct ListNode {

  • int val;

  • ListNode *next;

  • ListNode(int x) : val(x), next(NULL) {}

  • };
    /
    /
    *

  • Definition for singly-linked list.

  • struct ListNode {

  • int val;

  • ListNode *next;

  • ListNode(int x) : val(x), next(NULL) {}

  • };
    /
    class Solution {
    public:
    ListNode
    middleNode(ListNode* head) {
    ListNode* p = head;
    ListNode* phead = NULL;
    int size = 0;
    while(p) //遍历得出链表元素的个数size
    {
    size++;
    p = p->next;
    }
    int val = 0;

    if(size>1) //如果size == 1则直接返回整个链表即可,因此需要判断size是否等1
    {
    int k = size/2; //无论是偶数还是基数链表,返回值都是k为起始
    while(head)
    {
    val++;
    head = head->next;
    if(k == val)
    {
    return head;
    }
    }
    }
    else
    {
    return head;
    }

    return 0;
    }
    };

posted @ 2020-03-23 21:48  爱喝奶茶但是不爱学习  阅读(406)  评论(0)    收藏  举报