又见链表 --- 另一种Creat方式与反转
生活随笔
收集整理的這篇文章主要介紹了
又见链表 --- 另一种Creat方式与反转
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
鏈表
作為一種數據結構,鏈表以其方便的增刪查改功能,實現了無數經典有用的程序。
在之前的帖子里,我構建鏈表的方式是建立一個不儲存數據的head節(jié)點,然后通過一邊輸入數據一邊建立結點的方式構建整個鏈表。
與之前不同的是,這里建立的是包含數據的頭結點head:
下面是代碼,包含創(chuàng)建部分,輸出部分,刪除部分,和插入部分。
struct Node {int data;Node *next; };int n = 0; // 結點數 //=============Node_Creat==============// Node *Node_Creat() {Node *head = NULL; // 頭指針置NULL Node *p1,*p2; // 開辟一個Node大小的空間 使p1和p2指向該空間 p1 = p2 = (Node *)malloc(sizeof(Node));if(p1 == NULL || p2 == NULL){printf("Overflow\n");exit(1);}scanf("%d",&p1 -> data); while(p1 -> data >= 0){n++;if(head == NULL){head = p1;} else{p2 -> next = p1;}p2 = p1;p1 = (Node *)malloc(sizeof(Node));if(p1 == NULL){printf("Overflow\n");exit(1);}scanf("%d",&p1 -> data);}p1 = NULL;p2 -> next = NULL;return head; }//============Node_Print==============// void Node_Print(Node *head) {Node *p = head;if(head == NULL) // 鏈表為空 {printf("Empty!\n");return ;}else{printf("Total: %d Node\n",n);while(p != NULL){printf("%d ",p -> data);p = p -> next; }printf("\n");} }//==============Node_Delete()===============// void Node_Delete(Node *head,int num) {Node *p1,*p2;p1 = head;if(p1 == NULL) // 鏈表為空{printf("Empty\n");return ;} if(num > n) // 結點不存在 {printf("Not Found!\n");return ;}n--; // 結點數-1 int i;for(i = 1; i < num; i++){if(p1 -> next == NULL)break;p2 = p1;p1 = p1 -> next;}if(p1 == head) // 頭節(jié)點 即第一個{head = p1 -> next;}else{p2 -> next = p1 -> next;free(p1);}Node_Print(head); }//============Node_Insert()============// void Node_Insert(Node* head,int num,int i_data) {Node * newNode;newNode = (Node *)malloc(sizeof(Node));if(newNode == NULL){printf("Overflow\n");exit(1);}newNode -> data = i_data;newNode -> next = NULL;Node *p1,*p2;p1 = head;for(int i = 1 ;i < num; i++){p2 = p1;p1 = p1 -> next;}p2 -> next = newNode;newNode -> next = p1;n++; // 結點數+1 Node_Print(head); }樣例:
鏈表的反轉
我這里采用的方法是 改變兩個結點間next指針的指向,原結點next指針指向下一個結點,反轉后指向前一個結點。
Node* Node_Reverse(Node* head) {Node* pNow = head;//當前結點Node* pPrv = NULL;//當前結點的前一個結點Node* pReversedHead = NULL;//反轉鏈表頭結點Node* pNext = NULL;//當前結點的下一個結點while(pNow != NULL){pNext = pNow -> next;if(pNext == NULL)//如果當前結點的下一個結點為空,那么反轉鏈表的頭結點就是當前結點。pReversedHead = pNow;pNow -> next = pPrv;//當前結點指向前一個結點pPrv = pNow;//pPrv和pNow往前移動。pNow = pNext;//這里要使用前面保存下來的pNext,不能使用pNow->next}return pReversedHead;//返回反轉鏈表頭指針。 }大概的一個流程圖(反轉第一個結點)
注:紅色箭頭代表pPrev,pNext和pNow的移動,藍色代表next指針的指向。
轉載于:https://www.cnblogs.com/qq952693358/p/5503244.html
總結
以上是生活随笔為你收集整理的又见链表 --- 另一种Creat方式与反转的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 解决hibernate中的懒加载(延迟加
- 下一篇: git常用命令有用