單項鏈表插入操作,我想應該是最基礎不過的東西,今天要介紹的是比較簡潔的版本。
需求:插入一個node到鏈表的正確位置,當前鏈表中節點的value已經按照由小到大進行排列。
傳統的插入操作:
int insertNode(Node** rootp,int new_value){Node *current;Node *previous;Node *new;current = *rootp;previous = NULL;while(current != NULL && current->value < new_value){previous = current;current = current->link;}new = (Node*)malloc(sizeof(Node));if(new == NULL)return 0;new->value = new_value;new->link = current;if(previous == NULL){*rootp = new;}else{previous->link = new;}return 1;}
上面的演算法雖然沒有什麼問題,但是需要定義current和previous2個變數,
而且需要對插入到第一個node的情況作特殊處理。
下面請看改進版本,只要定義一個current變數,而且不需要插入到第一個node的情況作特殊處理。
int insertNode(Node** linkp,int new_value){Node *current;Node *new;while(current = *linkp)!= NULL && current->value < new_value){linkp = &t->link;}new = (Node*)malloc(sizeof(Node));if(new == NULL)return 0;new->value = new_value;new->link = current;*linkp = new;return 1;}
如果鏈表開始的狀態如下:
可見,new node需要插入到一個表頭。
插入前的各指標的狀態如下:
插入new node