問題一:單鏈表反轉,提供空間復雜度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()); }