我在前面幾篇博客中《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__); } }