【面試題】單鏈表逆轉、字符串按單詞逆轉


問題一:單鏈表反轉,提供空間復雜度O(1),時間復雜度O(n),

解法:利用三個指針遍歷一遍,下面用圖來闡釋。

圖1,初始情況,給定head指針,鏈表末尾指向NULL。

 

圖2,創建三個節點指針,分別為p指向head,q指向p->next,r指向q->next。並且將p指向NULL,因為逆轉鏈表之后,最開始的頭結點將變成尾節點,head->next = NULL

 

 

圖3,將q的next節點指向p,即q->next = p.

 

 

圖4,三個指針分別向后移動一位,p = q, q = r, r = r->next。

循環終止的條件是r == NULL,這時還需要將最后一個節點指向前一個節點,即q->next = p, 並且把q賦給head,完成逆轉。

 

代碼:

 1 LinkedList* reverse(LinkedList* head)
 2 {
 3     if(head == NULL) return head;
 4     LinkedList *p, *q, *r;
 5     p = head;
 6     q = p->next;
 7     r = q->next;
 8     head->next = NULL;
 9     while(r)
10     {
11         q->next = p;
12         p = q;
13         q = r;
14         r = r->next;
15     }
16     q->next = p;
17     head = q;
18     return head;
19 }

 

 

問題二:O(1)空間復雜度、O(n)時間復雜度,要求將一個字符串按單詞逆轉,比如 This is a sentence,變成sentence a is This

代碼:

//設計算法實現字符串逆序存儲,要求不另設串存儲空間
void swap(string & s, int i, int j)
{
    char tmp = s[i];
    s[i] = s[j];
    s[j] = tmp;
}

void reverseString(string &s, int begin, int end)
{
    for(int i=begin; i<(end + begin)/2; ++i)
        swap(s, i, end-1-i+begin);
}

//先整體逆序,再按單詞逆序
void reverseWord(string &s)
{
    reverseString(s, 0, s.size());
    //cout<<s<<endl;
    int begin = 0, i = 0;
    while(i<s.size())
    {
        if(s[i] == ' ')
        {
            reverseString(s, begin, i);
            begin = i + 1;
            //cout<<i<<"\t"<<begin<<endl;
        }
        i++;
    }
    reverseString(s, begin, s.size());
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM