1

リストで逆関数を送信すると、期待どおりの出力が得られます。しかし、reverseNth関数を使用すると、リストの最初のものしか取得できません。ReverseNthは、セクションのリストを逆にします。たとえば、リストがある場合= <1 2 345>。reverse()を呼び出すと、<5 4 321>が出力されます。リストでreverseNth(2)を呼び出すと、<2 1 435>が得られます。

関連コード:

void List<T>::reverse( ListNode * & startPoint, ListNode * & endPoint )
{
    if(startPoint == NULL || startPoint == endPoint)
        return;
    ListNode* stop = endPoint;
    ListNode* temp = startPoint;
    startPoint = endPoint;
    endPoint = temp;
    ListNode* p = startPoint; //create a node and point to head

    while(p != stop)
    {
        temp = p->next;
        p->next = p->prev;
        p->prev = temp;
        p = p->next;
    }
}

ReverseNthコード:

void List<T>::reverseNth( int n )
{
    if(head == NULL || head == tail || n == 1 || n == 0)
        return;

    if(n >= length)
    {
        reverse(head,tail);
        return;
    }

    ListNode* tempStart = head;
    ListNode* tempEnd;

    for(int j = 0; j < length; j += n)
    {
        // make the end of the section the beginning of the next
        tempEnd = tempStart;
        // set the end of the section to reverse
        for(int i = 0; i < n-1; i ++)
        {
            // check to make sure that the section doesn't go past the length
            if(j+i == length)
                i = n; 
            else
                tempEnd = tempEnd-> next;
        }

        reverse(tempStart, tempEnd);

        if( j == 0)
            head = tempStart;
        if(tempStart == tail)
        {
            tail = tempEnd;
            return;
        }
        else
            tempStart = tempEnd-> next;
    }
    tail = tempEnd;
}
4

1 に答える 1

0

逆関数を使用startPointしていません。endPoint現在、reverse関数はリスト全体を逆にし、古いhead->nextものはnullを指すようにします(これで終わりです)。

リスト全体を逆にするために使用された逆関数を推測していますが、その後、任意の開始/終了ポイントを取るように拡張されました(おそらくオーバーロード?)。

于 2012-09-25T01:27:48.057 に答える