單鏈表反轉可用迭代法,也可用遞歸方法,這里用迭代法(循環)實現。
示意圖如下,其中pre指前一個節點,cur指當前節點,temp為臨時節點。
主要思路就是讓當前節點指向前一個節點,即cur->next=pre,需要事前將cur->next賦值給temp。然后下移即可。
#include <stdio.h> typedef struct node_s { int item; struct node_s* next; }node_t,*link; //新建節點 link newNode(int item) { link new = malloc(sizeof(node_t)); new->item = item; new->next = NULL; return new; } link Reverse(link header){ if (header == NULL || header->next == NULL) { return header;} link pre; //前一個 link cur; //當前 link temp;//臨時變量 pre = header; cur = header->next; pre->next = NULL; while (cur != NULL) { temp = cur->next; //temp暫存 cur->next = pre; //cur指向后面實現逆序 pre = cur; //pre后移 cur = temp; //cur后移 } return pre; } void printLink(node_t* header){ while (header != NULL){ if (header->next != NULL){ printf("%d->", header->item); //不是最后一個 } else{ printf("%d", header->item); } header = header->next; } printf("\n"); } int main(int argc, char* argv[]){ //創建單向鏈接 node_t *header = NULL, *cur = NULL; for (int i = 1; i <= 3; ++i) { node_t* new = newNode(i); if (header == NULL){ header = new; } else{ cur->next = new; //加到后面 } cur = new; } printLink(header); //打印鏈表 auto newHeader = Reverse(header); //auto關鍵字,只用在賦值語句中 printLink(newHeader); system("pause"); }