単一チェーンテーブルの中間ノードを検索するには、チェーンテーブルを1回だけ巡回する必要があります.

1294 ワード

質問説明:単一チェーンテーブルの中間ノードを検索するには、チェーンテーブルの実現構想を1回しか遍歴できないことが要求されています.まずチェーンテーブルを1回遍歴し、チェーンテーブルノードの個数を統計し、それから2つのヘッドノードを指すポインタを設定し、最初のチェーンテーブルの個数の半分を先に行かせ、もう1つのポインタが同じ時間に歩き始め、最初のポインタがチェーンテーブルの終わりに着いたとき、もう一つのチェーンテーブルが指すノードはチェーンテーブルの仲介ノードである.具体的なコードは以下のように実現される.
typedef int DataType;
typedef struct SListNode{
    struct SListNode* _next;
    DataType _data;
}SListNode,*pSListNode;


pSListNode FindMiddleNode(pSListNode pHead)
{
    int count = 0;
    int Mid = 0;
    pSListNode cur = pHead;
    pSListNode tmp = pHead;
    while (cur)
    {
        count++;
        cur = cur->_next;
    }
    Mid = count >> 1;
    cur = pHead;
    while (Mid--)
    {
        cur = cur->_next;
    }
    while (cur)
    {
        tmp = tmp->_next;
        cur = cur->_next;
    }
    return tmp;
}