連結串列面試題(四)---查詢連結串列的中間節點

gogogo_sky發表於2017-05-16

一、結構體定義:

typedef int DataType;

typedef struct ListNode//定義結點
{
    DataType data;
    struct ListNode* next;
}ListNode,*PListNode;

typedef struct  PList//定義一個成員是指向結點的指標的結構體
{
    PListNode PHead;
}PList,*PList;

二、函式實現:
方法一:方法1(計數法)—遍歷兩遍

//4.查詢連結串列的中間節點---方法1(計數法)---遍歷兩遍
PListNode FindMidNode1(PList PList)
{
    int count=0;
    int mid=0;
    PListNode cur;
    assert(PList);
    cur=PList->PHead;
    if (PList->PHead==NULL||PList->PHead->next==NULL)//如果連結串列為空或者連結串列只有一個結點
    {
        return PList->PHead;//返回第一個結點(空||結點)
    }
    else//連結串列結點超過一個
    {
        while (cur)
        {
            count++;
            cur=cur->next;
        }
        printf("連結串列結點個數為:%d",count);
        mid=count/2;
        cur=PList->PHead;
        while (mid)
        {
            mid--;
            cur=cur->next;
        }
        return cur;
    }
}

方法二:方法2(快慢指標法)—遍歷一遍

思路:慢指標每一次走一步,快指標每次走兩步,快指標走到尾時,慢指標正好走到中間

//4查詢單連結串列的中間節點---方法2(快慢指標法)---遍歷一遍

PListNode FindMidNode2(PList PList)
{
    PListNode fast=NULL;
    PListNode slow=NULL;
    assert(PList);
    fast=PList->PHead;
    slow=PList->PHead;
    while (fast!=NULL&&fast->next!=NULL)//防止對空指標的訪問操作
    {
        fast=fast->next->next;
        slow=slow->next;
    }
    return slow;
}

這裡寫圖片描述

相關文章