單鏈表的逆序(反轉)


單鏈表的逆序,本來不是算法這一部分的,怎奈何小伙伴們說,面試考的機率比較大,故此就把它跟算法放到一起了。

關於單鏈表逆序的基本知識點,請參加: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 }

運行示例:

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM