數據結構與算法基礎(二)之單鏈表的插入與刪除操作

    今天主要來講一講單鏈表的插入與刪除操作的步驟和算法解釋。這是單鏈表最基本的操作但是也是最重要的基礎之一,有些地方還比較容易出錯。下面我就結合源代碼在上面加上註釋來解釋每一步的作用。

    **一、單鏈表的插入操作**

1、圖示(截圖來自網易雲課堂魚C工作室《數據結構和算法》課程視頻)
這裏寫圖片描述
2、 要想將結點s插入到ai與ai+1之間,不需要移動數據元素,只需要在ai與ai+1之間插入一個新的結點,也就是我們要插入的結點s。關鍵就是要修改結點p的指針域,使得結點s稱爲其後繼。修改指針的鏈接的主要操作語句是:

s->next=p->next;         //把結點p的後繼作爲結點s的後繼;
p->next=s;              //把結點s作爲結點p的後繼;

注意這兩個語句的順序不能調換不能調換不能調換!!!

爲什麼呢?如果調換①和②的順序,那麼插入操作就無法完成,並且會丟失ai結點的地址以及ai及其後面所有結點的信息。

3、下面演示插入操作的算法:

bool ListInsert_L(LinkList &L,int i,ElemType e)
{   //在帶有頭結點的單鏈表L中的第i個結點前插入元素e
    LinkList p,s;
    int j;
    p=L;j=0;  //①聲明一結點p指向鏈表頭結點,初始化j從0開始;
    while(p->next&&j<i-1){ 
    p=p->next;
    j++;
    }  //②尋找第i-1個結點並讓p指向此結點
    if(j!=i-1)  return false;   //③若i的位置不合理則報錯
    if((s=(LNode*)malloc(sizeof(LNode)))==NULL)  exit(1);     //④查找成功,在系統中生成一個空結點s;
    s->data=e;    //⑤將數據元素e複製給s->data;
    s->next=p->next;p->next=s;   //⑥插入操作(關鍵語句)
    return true;   //⑦返回成功;
}     

二、單鏈表的刪除操作
1、刪除圖示(圖片出處同上)
這裏寫圖片描述
2、刪除操作和插入類似,在刪除一個結點時,不需要移動元素,僅需要修改相應的指針鏈接,改變其前驅和後繼的關係即可。
主要操作語句爲:

p->next=q->next;  //結點q的後繼成爲結點p的後繼
e=q->data;        //將被刪除的元素的值賦給e
free(q);          //釋放被刪除結點的空間

3、下面演示刪除元素的算法,註釋含有步驟解釋。

bool ListInsert_L(LinkList &L,int i,ElemType e)
{   //刪除帶有頭結點的單鏈表L中的第i個結點,並饒讓e返回其值
    LinkList p,q;
    int j;
    p=L;j=0;  //①聲明一結點p指向鏈表頭結點,初始化j從0開始;
    while(p->next->next&&j<i-1&&p->next){ 
    p=p->next;
    j++;
    }  //②尋找第i-1個結點並讓p指向此結點
    if(j!=i-1)  return false;   //③若i的位置不合理則報錯
    q=p->next;       //④若查找成功,q指向其後繼
    p->next=p->next;  //⑤結點q的後繼成爲結點p的後繼
    e=q->data;        
    free(q);          //⑥將被刪除的元素的值賦給e,釋放被刪除結點的空間
    return true;   //⑦返回成功;
}     //LinkDelete_L

三、關於順序存儲與鏈式存儲中插入刪除操作的效率PK
1、無論是單鏈表的插入操作還是刪除操作,都是由兩部分組成的:一是遍歷查找第i個元素,二是實現插入或刪除操作。

就整個算法而言,他們的時間複雜度都是O(n),這樣來看的話,再不知道要找的第i個元素所處的位置時,單鏈表的插入刪除操作和順序存儲是沒有什麼優越性的。

但是!如果知道要插入或者刪除的元素的位置時,鏈式存儲就表現出它的優越性了。假如我們要在a10與a11之間插入10個元素,那麼順序存儲每插入一個元素後面的元素就要移動一次位置,每次都是O(n)。而鏈式存儲,只需要第一次時找到要插入的那個位置,後面的就只是賦值移動指針而已,時間複雜度爲O(1)。

因此,可以得出一個結論:對於插入或者刪除操作越頻繁的操作,單鏈表的效率優勢就越是明顯。

發佈了24 篇原創文章 · 獲贊 30 · 訪問量 15萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章