【資料結構】將資料域中最小的節點移動的單鏈表的最前面
阿新 • • 發佈:2021-10-10
一、題目描述
已知線性連結串列由list指出,鏈節點的構造為(data,next),請寫一個演算法,將連結串列中資料域值最小的那個節點移動到連結串列的最前面。(不能申請額外的節點)(更好的閱讀體驗,請訪問程式設計師在旅途)
二、分析解答
主要解題思路就是,遍歷連結串列,找到最小的那個節點min,以及該節點的前驅pre_min,然後將其移到連結串列的最前面。
值得注意的是,由於節點結構要求的是單向單鏈表,因此,如果要移動min,必須要找到他的前驅。如果是雙向連結串列,就可以不用記錄前驅結點了。
主要程式碼
void Move_Min_To_First(LinkList *L) { LinkList *pre_p = L->next,*p = pre_p->next; LinkList *pre_min = L,*min = L->next; while(p->next!=NULL) { if(min->data>p->data) { min = p; pre_min = pre_p; } pre_p = p; p = p->next; } pre_min->next = min->next; min->next = L->next; L->next = min; return 1; }
完整可執行程式程式碼如下:
點選檢視程式碼
#include<stdio.h> #include<stdlib.h> typedef struct node{ int data; struct node *next; }Node,*PNode; /* 方法思路: 遍歷連結串列,找到其中最小的元素節點及其前驅結點,然後將最小的節點放置在連結串列最前面。 返回值: -1 連結串列為空,無法尋找; 0 查詢失敗; 1查詢成功。 */ int move_min_to_first(PNode head){ PNode pre_p = head->next, p = pre_p->next; //將最小的元素節點及其前驅記錄下來 PNode pre_min = head, min = pre_p; //判斷連結串列是否為空 if(head == NULL || head->next == NULL){ return -1; } //遍歷連結串列,尋找最小元素節點 while(p){ if(min->data > p->data){ pre_min = pre_p; min = p; } pre_p = p; p = p->next; } //移動到連結串列的最前面 pre_min->next = min->next; min->next = head->next; head->next = min; return 1; } //頭插法建立帶有頭結點的單鏈表 PNode creat_list(){ //申請頭結點 PNode head = (PNode)malloc(sizeof(Node)); head->next = NULL; scanf("%d",&(head->data)); // 頭結點的資料域可以存放總結點數 //新增元素 PNode p = NULL; int i; for(i=0;i<(head->data);i++){ p = (PNode)malloc(sizeof(Node)); scanf("%d",&(p->data)); //這是頭插法的關鍵所在 p->next = head->next; head->next = p; } return head; } void print_list(PNode head){ PNode p = head->next; while(p){ printf("p->data: %d \t",p->data); p = p->next; } printf("\n"); } int main(){ PNode head = creat_list(); print_list(head); move_min_to_first(head); print_list(head); return 0; }