單鏈表的反轉(資料結構 面試題)

2021-07-04 20:31:25 字數 1228 閱讀 3753

編寫乙個演算法來顛倒乙個鍊錶,該鍊錶的第乙個結點由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。我採用的是第一...