天天看點

【408資料結構與算法】—單連結清單的基本操作(六)

【408資料結構與算法】—單連結清單的基本操作(六)

一、單連結清單—取第i個元素值

算法的思路:分别取出第3個元素和第i個元素的内容。從連結清單的頭指針出發,順着鍊域next逐個結點往下搜尋,直到搜尋到第i個結點為止,是以,連結清單不是随機存取結構

【408資料結構與算法】—單連結清單的基本操作(六)

算法的思路:

  • 從第1個結點(L->next)順鍊掃描,用指針p指向目前掃描到的結點,p初始值p=L->next
  • j做計數器,累計目前掃描過的節點數,j的初始值為1
  • 當p指向掃描到的下一結點時,計數器j加1
  • 當j==i時,p所指的結點就是要找的第i個結點
【408資料結構與算法】—單連結清單的基本操作(六)

二、單連結清單—按值查找

按值查找—根據指定資料擷取該資料所在的位置(位址)例如:分别查找30和值為15的元素

【408資料結構與算法】—單連結清單的基本操作(六)

算法步驟:

  • 從第一個結點起,依次和e相比較
  • 如果找到一個其值與e相等的資料元素,則傳回其在連結清單中的位置或位址
  • 如果查遍整個連結清單都沒有找到其值和e相等的元素則傳回0或null

算法描述

【408資料結構與算法】—單連結清單的基本操作(六)

算法設計—根據指定資料擷取該資料位置序号

【408資料結構與算法】—單連結清單的基本操作(六)

三、單連結清單—插入

插入—在第i個結點前插入值為e的新結點

【408資料結構與算法】—單連結清單的基本操作(六)

算法步驟:

  • 首先找到ai-1的存儲位置p
  • 生成一個資料域為e的新結點s
  • 插入新結點:新結點的指針域指向結點ai;結點ai-1的指針域指向新結點

    📢思考:步驟1和步驟2能互換位置嗎?先執行2後執行1,可以嗎?

    📢不可以,會丢失ai的位址

算法描述:

【408資料結構與算法】—單連結清單的基本操作(六)

四、單連結清單—删除

  • 删除第i個結點

    算法步驟:

  • 首先找到ai-1的存儲位置p,儲存要删除的a的值
  • 令p->next指向ai+1
  • 釋放結點ai的空間

    算法描述

五、單連結清單的查找時間效率分析

【408資料結構與算法】—單連結清單的基本操作(六)
  • 查找:因線性表隻能順序存取,即在查找時要從頭指針找起,查找的時間複雜度為O(n)
  • 插入和删除:因線性表不需要移動元素,隻要修改指針,一般情況下時間複雜度為O(1); 但是,如果要在單連結清單中進行前插或删除操作,由于要從頭查找前驅結點,所耗時間複雜度為O(n)

六、單連結清單的建立

1️⃣ 建立單連結清單—頭插法:元素插入在連結清單頭部,也叫前插法

算法思路:

  • 從一個空表開始,重複讀入資料
  • 生成新結點,将讀入資料存放到新結點的資料域中
  • 從最後一個結點開始,依次将各結點插入到連結清單的前端

例如:建立連結清單L(a,b,c,d,e)

【408資料結構與算法】—單連結清單的基本操作(六)
【408資料結構與算法】—單連結清單的基本操作(六)

2️⃣ 建立單連結清單—尾插法:元素插入在連結清單尾部,也叫後插法

  • 從一個空表L開始,将新結點逐個插入到連結清單的尾部,尾指針r指向連結清單的尾結點。
  • 初始時,r同L均指向頭結點,每讀一個資料元素則申請一個新結點,将新結點插入到尾結點後,r 指向新結點

繼續閱讀