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