我在前面幾篇部落格中《C語言實現鏈表節點的插入》《C語言實現鏈表節點的刪除》《C實現頭插法和尾插法來構建鏈表》《C語言實現鏈表的基本操作》實現了單鏈表的很多增刪改查操作。這裡我們要來實現單鏈表的逆序列印,使用C來實現。代碼上傳至 https://github.com/chenyufeng1991/ReverseLinkedList 。
基本演算法是:
(1)使用尾插法構建原鏈表;
(2)依次遍曆原鏈表;
(3)取出遍曆中的節點使用頭插法建立一個新鏈表;
(4)列印逆序後的新鏈表;
原理就是頭插法每次插入的節點都是鏈表的第一個,第一個插入的會變成最後一個,最後一個插入的就成了第一個節點。所以就會造成逆序。
核心代碼如下:
//聲明逆序後的鏈表Node *pReverseList;//頭插法建立逆序後的鏈表void HeadInsert(Node *pInsert){ if (pReverseList == NULL) { //這個是第一個節點 pReverseList = pInsert; }else{ //下面的是頭插的語句 pInsert->next = pReverseList; pReverseList = pInsert; }}//遍曆鏈表並使用頭插法構建新鏈表void scanList(Node *pNode){ //首先判斷原鏈表是否為空白; if (pNode == NULL) { printf("%s函數執行,原鏈表為空白,無法逆序輸出\n",__FUNCTION__); }else{ Node *pMove; //該節點用來在原鏈表中移動 Node *pInsert; //該節點為建立的插入節點 pInsert = (Node *)malloc(sizeof(Node)); memset(pInsert, 0, sizeof(Node)); pInsert->next = NULL; pMove = pNode; while (pMove != NULL) { //遍曆到每一個節點後,調用頭插法函數插入新鏈表 pInsert->element = pMove->element; HeadInsert(pInsert); //為插入的下一個節點分配空間 pInsert = (Node *)malloc(sizeof(Node)); memset(pInsert, 0, sizeof(Node)); pInsert->next = NULL; pMove = pMove->next; } printf("%s函數執行,逆序鏈表完成\n",__FUNCTION__); }}