單鏈表的逆序,本來不是算法這一部分的,怎奈何小伙伴們說,面試考的機率比較大,故此就把它跟算法放到一起了。
關於單鏈表逆序的基本知識點,請參加:http://blog.csdn.net/autumn20080101/article/details/7607148
當您看了上面博文的一部分,就能基本了解的時候,下面的內容應該適合您了。下面的內容是對單鏈表逆序的關鍵知識點的一個總結。
博主客人覺得,單鏈表最關鍵的是本節點有一個指向下一個節點的指針(即后繼節點指針),雙向鏈表則是本節點有一個前驅節點和一個后繼節點。
單鏈表時通過while循環,從頭節點開始,直到節點的后繼節點為空時,則到達了鏈表的尾部。
其實,單鏈表逆序,靠的就是下面的關鍵代碼:
1 while (head != NULL) { 2 //在頭節點改變之前,先獲取下一個節點的指針 3 next = head->Next; 4 //頭節點的下一個節點要改成它的上一個節點,是一個逆轉的過程 5 head->Next = prev; 6 //上一個節點前移指向頭節點 7 prev = head; 8 //頭節點前移指向下一個節點 9 head = next; 10 }
開發環境為:qt, c語言代碼:
完整代碼:
1 #include <QCoreApplication> 2 3 //定義常數值 4 #define LEN 3 5 const int MAX_NUM = 5; 6 7 //定義節點 8 //typedef struct tagNode* linkNode; 9 typedef struct tagNode{ 10 int key; 11 char value[LEN]; 12 struct tagNode* Next; 13 } *Node, *linkList; 14 15 //生成鏈表 16 linkList generateLinkList(); 17 //釋放鏈表 18 void freeLinkList(linkList list); 19 //反轉鏈表 20 Node ReverseLinkList(Node head); 21 //打印鏈表 22 void printLinkList(linkList list); 23 24 int main(int argc, char *argv[]) 25 { 26 QCoreApplication a(argc, argv); 27 //生成鏈表 28 Node head = generateLinkList(); 29 printf("反轉之前的鏈表\r\n"); 30 //打印鏈表 31 printLinkList(head); 32 //鏈表反向 33 head = ReverseLinkList(head); 34 printf("反轉之后的鏈表\r\n"); 35 //打印反向后的鏈表 36 printLinkList(head); 37 //釋放鏈表內存 38 freeLinkList(head); 39 return a.exec(); 40 } 41 /** 42 * @函數名:generateLinkList 43 * @參數:無 44 * @返回值:鏈表對象指針(首節點) 45 * @用途:生成鏈表對象 46 * @作者:yangfy 47 */ 48 linkList generateLinkList() 49 { 50 Node head, prev; 51 //頭節點 52 head = (Node)malloc(sizeof(Node)); 53 head->key = 1; 54 snprintf(head->value, LEN - 1, "%c", 65); 55 //prev初始指向頭節點 56 prev = head; 57 //初始化鏈表元素 58 for(int i = 1; i < MAX_NUM; i++){ 59 Node pNode = (Node)malloc(sizeof(Node)); 60 //形成鏈表數據 61 pNode->key = i + 1; 62 pNode->Next = NULL; 63 snprintf(pNode->value, LEN - 1, "%c", 65 + i); 64 //前一個節點的下一個節點指向本節點(pNode) 65 prev->Next = pNode; 66 //把前一個節點置為本節點,進入下一個循環 67 prev = pNode; 68 } 69 return head; 70 } 71 /** 72 * @函數名:freeLinkList 73 * @參數:head:頭節點指針 74 * @返回值:無 75 * @用途:鏈表指針內存資源的釋放。 76 * @作者:yangfy 77 */ 78 void freeLinkList(Node head) 79 { 80 while (head != NULL) { 81 Node next = head->Next; 82 free(head); 83 head = next; 84 } 85 } 86 87 /** 88 * @函數名:ReverseLinkList 89 * @參數:head:頭節點指針 90 * @返回值:反轉后頭節點指針 91 * @用途:鏈表的反轉 92 * @作者:yangfy 93 */ 94 Node ReverseLinkList(Node head) 95 { 96 Node prev = NULL; 97 Node next = NULL; 98 while (head != NULL) { 99 //在頭節點改變之前,先獲取下一個節點的指針 100 next = head->Next; 101 //頭節點的下一個節點要改成它的上一個節點,是一個逆轉的過程 102 head->Next = prev; 103 //上一個節點前移指向頭節點 104 prev = head; 105 //頭節點前移指向下一個節點 106 head = next; 107 } 108 return prev; 109 } 110 111 112 void printLinkList(linkList list) 113 { 114 Node node = list; 115 while (node != NULL) { 116 if(node->Next != NULL) 117 printf("當前的key為:%d, 值為:%s; 下一個key為:%d, 值為%s\r\n",node->key, node->value, node->Next->key, node->Next->value); 118 else 119 printf("當前的key為:%d, 值為:%s; 下一個key為:NULL, 值為NULL\r\n",node->key, node->value); 120 node = node->Next; 121 } 122 }
運行示例: