編寫乙個演算法來顛倒乙個鍊錶,該鍊錶的第乙個結點由first指向。不要複製列表元素;而是重置鏈結和指標,使得first指向原來的最後乙個結點,並且結點之間的所有鏈結都反向。
思路:因為題目中明確說明不能複製元素,所以通過複製來重置另外乙個鍊錶的想法被終止。我們想到,如果要改變連線的指向,又能夠要使鍊錶繼續遍歷,那麼最少需要先遍歷到幾個結點呢?答案是3個。如圖:(第二張是將要結束時的情況)
3個結點之後就可以對第乙個連線進行反轉,直到
cur->next-==null
結束,然後對最後乙個特殊處理即可,詳見**。
#include #include #include #include #include using namespace std;
template class clist
}; node *front;
node *tail;
int size;
clist(node *f = null, node*t = null, int s = null) :front(f), tail(t), size(s){}
~clist()
delete temp;
size = 0;
} }void build_list_rand(int len)
tail = temp;
tail->value = rand()%100+1;
tail->next = null;
} void swap(node* &a, node* &b)
void clist::reserve()
else
mid->next = head;
tail->next = null;
} }void display()
cout << temp->value << endl;
cout << "the size is " << size << endl;
}};int main()
執行結果:
面試題 單鏈表反轉
問題 定義乙個函式,輸入乙個鍊錶的頭結點,反轉該鍊錶並輸出反轉後鍊錶的頭結點。一 非遞迴演算法 假設有鍊錶a b c d e f g。在反轉鍊錶過程中的某一階段,其鍊錶指標指向為 a b c d e f g。也就是說在結點d之前的所有結點都已經反轉,而結點d後面的結點e開始的所有結點都沒有反轉。這樣...
鏈表面試題 反轉單鏈表
反轉乙個單鏈表。示例 輸入 1 2 3 4 5 null 輸出 5 4 3 2 1 null解決方案 頭插法開闢新鍊錶並逐個讀取舊鍊錶,頭插進新鍊錶,這樣新的鍊錶與原鍊錶的結構就是反的,需要借助輔助空間 definition for singly linked list.struct listnod...
騰訊面試題 單鏈表的反轉
鍊錶反 建立乙個新的鍊錶,遍歷舊的鍊錶,每取出來乙個資料就按照頭插法的方式插入行的鍊錶。直接在此鍊錶上操作,完成鍊錶的反轉。其實也是按照頭插法來加入節點的,先定義乙個輔助指標,指向第乙個節點,然後將頭結點的next置為空,最後用輔助指標遍歷鍊錶,每取出乙個元素就按頭插法鏈結到head。我採用的是第一...