p52 单链表中间节点 (leetcode 876)

一:解题思路

方法一:先计算出链表的长度,然后用一个指针指向链表的首结点,让这个指针走链表一般的长度,最后就落在链表的中间位置。

方法二:快慢指针法,先让快指针和慢指针都分别指向链表首节点,快指针每次走两步,慢指针每次走一步,当快指针指向为空时,此时慢指针就指向中间节点。

二:完整代码示例 (C++版和Java版)

第一种方法C++:

class Solution 
{
public:
    ListNode* middleNode(ListNode* head) 
    {
        int len = 0;
        ListNode* p = head;

        for (ListNode* p = head; p != NULL; p = p->next, len++);

        for (int i = 0; i < len / 2; i++)
        {
            p = p->next;
        }

        return p;
    }
};

第一种方法Java:

class Solution {
    public ListNode middleNode(ListNode head)
    {
          int len=0;
          ListNode node=head;
          for(ListNode p=head;p!=null;p=p.next,len++);
          
          for(int i=0;i<len/2;i++)
          {
              node=node.next;
          }
          
          return node;
    }
}

第二种方法C++:

class Solution {
public:
    ListNode* middleNode(ListNode* head) 
    {
        ListNode* fast = head;
        ListNode* slow = head;

        while (fast != NULL && fast->next != NULL)
        {
            fast = fast->next->next;
            slow = slow->next;
        }

        return slow;
    }
};

第二种方法Java:

class Solution {
    public ListNode middleNode(ListNode head)
    {
          ListNode fast=head;
          ListNode slow=head;
          
          while(fast!=null&&fast.next!=null)
          {
              fast=fast.next.next;
              slow=slow.next;
          }
          
          return slow;
    }
}

猜你喜欢

转载自www.cnblogs.com/repinkply/p/12513370.html