Henry手記—.NET資料結構物件補遺之單連結串列(二) (轉)

amyz發表於2007-08-15
Henry手記—.NET資料結構物件補遺之單連結串列(二) (轉)[@more@]

  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/,如需轉載,請註明出處,否則將追究法律責任。

相關文章