Henry手記—.NET資料結構物件補遺之單連結串列(二) (轉)
Henry手記—資料結構補遺之單連結串列(二):namespace prefix = o ns = "urn:schemas--com::office" />
韓睿 ( 06/15/)
3.4根據位置或資料元素值在連結串列中查詢
在連結串列中定位是對其進行操作的基礎,我們在類的內部定義兩個Protected的查詢:
Protected Overridable Function FinyIndex(ByVal index As Integer) As ListNode
'透過index來查詢連結串列中的結點
Dim tempIndex As Integer = 0
Dim current As ListNode = head.NextNode '從頭結點後的第一個結點開始
Dim returnValue As ListNode = Nothing '初始化返回結點
Do '迴圈查詢
If index = tempIndex Then
returnValue = current
Else
current = current.NextNode
tempIndex += 1
End If
L Until current Is Nothing Or Not returnValue Is Nothing
Return returnValue
End Function
Protected Overridable Function FindByValue(ByVal value As ) As Integer
'透過資料值來查詢連結串列中的結點的index
Dim tempIndex As Integer = 0
Dim current As ListNode = head.NextNode '從頭結點開始
Dim returnValue As Integer = -1 '初始化返回值
Do '迴圈查詢
If value.Equals(current.Data) Then
returnValue = tempIndex
Else
current = current.NextNode
tempIndex += 1
End If
Loop Until current Is Nothing Or returnValue > -1
Return returnValue
End Function
有這樣的基礎,我們就可以實現IList介面的IndexOf索引方法了:
Public Overridable Function IndexOf(ByVal value As Object) _
As Integer Implements IList.IndexOf
'透過結點資料值返回結點索引
Validate(value) '先驗證值
Return FindByValue(value) 'protected的查詢方法
End Function
這樣,我們在使用連結串列來查詢某個值的索引時,如果value為空,會丟擲一個異常;如果沒有找到,會返回-1;找到了會返回該資料元素所在的索引位置。是不是與ArrayList的處理方法很相似?
另外,我們還需要實現Contains功能,用於判斷連結串列中是否存在某個值:
Public Overridable Function Contains(ByVal value As Object) _
As Boolean Implements IList.Contains
'在連結串列中查詢value值
Validate(value)
If FindByValue(value) = -1 Then
Return False '找不到
Else
Return True '找到了
End If
End Function
3.5 新增結點
在上文第1節就提到過,新增結點有兩種情況,向連結串列尾新增與按索引值插入:
Public Overridable Function Add(ByVal value As Object) _
As Integer Implements IList.Add
'向連結串列尾新增結點
Validate(value) '先驗證值
tail.NextNode = New ListNode(value) '將現有尾結點的下一結點引用指向新結點
tail = tail.NextNode '將新新增的結點設為尾結點
version += 1 '更改版本號
nodeCount += 1 '新增連結串列計數
Return nodeCount - 1 '返回尾結點索引
End Function
Public Overridable Sub Insert(ByVal index As Integer, _
ByVal value As Object) Implements IList.Insert
'向指定的索引處新增結點
Validate(index, value) '驗證索引與資料值
Dim tempNode As ListNode = FindByIndex(index) '找到索引處的現有結點
'定義新結點,新結點的下一結點引用指向索引號為index的結點
Dim newNode As ListNode = New ListNode(value, tempNode)
'將index-1處的結點的下一結點引用指向新結點
FindByIndex(index - 1).NextNode = newNode
version += 1 '更改版本號
nodeCount += 1 '新增連結串列計數
End Sub
3.6 刪除結點
Protected Overridable Sub RemoveNode(ByVal node As ListNode, ByVal index As Integer)
'在類內部使用的刪除結點
'刪除結點的方法是將它前一結點的下一結點引用指向它的後一結點
Dim tempNode As ListNode = FindByIndex(index - 1) '找到欲刪除結點的前一結點
tempNode.NextNode = node.NextNode
If node Is tail Then
tail = tempNode
End If
version += 1 '更改版本號
nodeCount -= 1 '減少連結串列計數
End Sub
Public Overridable Sub Remove(ByVal value As Object) _
Implements IList.Remove
'類實現介面的刪除方法
Validate(value)
RemoveAt(FindByValue(value))
End Sub
Public Overridable Sub RemoveAt(ByVal index As Integer) _
Implements IList.RemoveAt
'類實現介面的按索引進行刪除的方法
Validate(index)
Dim node As ListNode = FindByIndex(index)
RemoveNode(node, index)
End Sub
Public Overridable Sub Clear() Implements IList.Clear
'清空連結串列
head.NextNode = Nothing
tail = head
nodeCount = 0
version = 0
End Sub
從上面的三個Remove方法來看,其實都是透過類內部的RemoveNode方法來進行刪除,只不過向提供了兩個介面:一個是根據索引值來刪除,一個是透過比對資料元素值來刪除。在這裡要說明一下,單連結串列因為不能反向查詢前一結點,因此刪除的比雙向連結串列低,這一點我們以後在實現雙連結串列的時候還會提及。
3.7 複製
將連結串列中的資料元素按某一索引為起始,將元素複製到Array中去。這一方法在實際操作中分外有用:
Public Overridable Sub CopyTo(ByVal array As System.Array, _
ByVal index As Integer) Implements IList.CopyTo
'從連結串列的索引處開始將元素複製到列表中去
If array Is Nothing Then
Throw New ArgumentNullException()
ElseIf index < 0 Then
Throw New ArgumentOutOfRangeException("索引越界")
ElseIf index >= array.Length _
Or (array.Length - index - 1) > nodeCount _
Or array.Rank <> 1 Then
Throw New ArgumentException()
End If
Dim current As ListNode = head.NextNode
Dim position As Integer = index
'迴圈複製
While Not current Is Nothing
array(position) = current.Data
current = current.NextNode
position += 1
End While
End Sub
----
宣告:本文版權與解釋權歸韓睿所有,如需轉載,請保留完整的內容及此宣告。
qq: 18349592
E-: .com">henry7685@hotmail.com
請訪問本人專欄:http://www.csdn.net/develop/author/netauthor/Latitude/
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752019/viewspace-959251/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 資料結構之單連結串列資料結構
- 資料結構實驗之連結串列二:逆序建立連結串列資料結構
- 資料結構-單連結串列、雙連結串列資料結構
- 資料結構實驗之連結串列五:單連結串列的拆分資料結構
- 資料結構之連結串列篇(單連結串列的常見操作)資料結構
- 資料結構之「連結串列」資料結構
- 資料結構之連結串列資料結構
- 資料結構之連結串列:206. 反轉連結串列資料結構
- Henry手記:WinForm Datagrid結構剖析(二)程式 (轉)ORM
- 畫江湖之資料結構【第一話:連結串列】單向連結串列資料結構
- 畫江湖之資料結構 [第一話:連結串列] 單向連結串列資料結構
- 資料結構04——單連結串列資料結構
- JavaScript資料結構 之 連結串列JavaScript資料結構
- 資料結構之連結串列【上】資料結構
- 資料結構之連結串列操作資料結構
- JAVA資料結構之連結串列Java資料結構
- 資料結構之php實現單向連結串列資料結構PHP
- 資料結構--陣列、單向連結串列、雙向連結串列資料結構陣列
- 資料結構之連結串列與陣列(3):單向連結串列上的簡單操作資料結構陣列
- 資料結構之迴圈連結串列資料結構
- 資料結構之雙向連結串列資料結構
- 資料結構實驗之連結串列九:雙向連結串列資料結構
- 資料結構之單連結串列的建立與刪除資料結構
- 實戰PHP資料結構基礎之單連結串列PHP資料結構
- python 資料結構之單連結串列的實現Python資料結構
- 學習 JavaScript 資料結構(二)——連結串列JavaScript資料結構
- 資料結構-連結串列資料結構
- 資料結構 - 連結串列資料結構
- 連結串列-資料結構資料結構
- 資料結構--連結串列資料結構
- 資料結構—連結串列資料結構
- 【資料結構】連結串列(單連結串列實現+詳解+原碼)資料結構
- 資料結構和演算法——Go實現單連結串列並且反轉單連結串列資料結構演算法Go
- js實現資料結構--單連結串列JS資料結構
- 單連結串列的歸併(資料結構)資料結構
- 【資料結構】線性表-單連結串列資料結構
- 資料結構實驗之連結串列三:連結串列的逆置資料結構
- 資料結構實驗之連結串列六:有序連結串列的建立資料結構