資料結構與演算法之鍊錶

2021-10-23 02:18:24 字數 4591 閱讀 3038

線性表

線性表的定義:一些元素的序列,維持著元素之間的線性關係。實現線性表的基本需要是:(1)能夠找到表首元素;(2)從表裡的任意元素出發,能找到它之後的下乙個元素;基於鏈結技術實現的線性表稱為鍊錶。

單鏈表

單鏈表的特點總結如下:

1、乙個單鏈表由一些具體的表結點組成;

2、每個節點是乙個物件,有自己的標識或鏈結;

3、節點之間通過節點鏈結建立起單向的順序結構

為了表示鍊錶的結束,通常會在最後乙個節點後邊設定乙個不會作為節點物件標識的值,稱為空鏈結。在python中通常會用none進行判斷是否為空。

鍊錶的操作包括建立、刪除、新增等,相應的它們複雜度如下:

在使用鍊錶的時候,我們經常會求表的長度,簡單實現函式如下:

def

length

(head)

: p,n = head,

0while p is

notnone

: n +=

1 p = p.

next

return n

單鏈錶類的實現

class

listnode

(object):

def__inti__

(self,elem,

next

=none):

self.elem = elem

self.

next

=next

#初始化

listnode1 = listnode(1)

p = listnode1

for i in

range(2

,11):

p.next

= listnode(i)

p = p.

next

p = listnode1 #頭指標

while p:

print

(p.elem)

p = p.

next

鍊錶的變形

迴圈單鏈表:表中的最後乙個節點的next域指向的不是none,而是指向表的第乙個節點。

雙鏈表:可以根據任一節點找到其前後相鄰的節點。

python 實現鍊錶刪減增操作

class

listnode

(object):

def__init__

(self,data,

next

=none):

self.data=data

self.

next

=next

class

linkedlist()

:def

__init__

(self)

: self.length =

0 self.head =

none

# 判斷鍊錶是否為空

defis_empty

(self)

:return self.length ==

0# 插入節點this_node

def(self, this_node):if

isinstance

(this_node, listnode)

:pass

else

: this_node = listnode(this_node)

if self.is_empty():

self.head = this_node

else

: p = self.head

while p.

next

: p = p.

next

p.next

= this_node

self.length +=

1# 在第index處插入節點this_node

definsert

(self, this_node, index)

:if index > self.length:

return

'error'

ifisinstance

(this_node, listnode)

:pass

else

: this_node = listnode(this_node)

if index ==0:

this_node.

next

= self.head

self.head = this_node

else

: p = self.head

while index -1:

p = p.

next

index -=

1 this_node.

next

= p.

next

p.next

= this_node

self.length +=

1# 刪除第index個節點

defdelete

(self, index):if

not0

<= index < self.length:

return

'error'

if index ==0:

self.head = self.head.

next

else

: p = self.head

while index -1:

p = p.

next

index -=

1 p.

next

= p.

next

.next

self.length -=

1# 更新第index節點的值

defupdate

(self, data, index):if

not0

<= index < self.length:

return

'error'

if index ==0:

self.head.data = data

else

: p = self.head

while index:

p = p.

next

index -=

1 p.data = data

# 獲取第index節點的值

defget_data

(self, index):if

not0

<= index < self.length:

return

'error'

if index ==0:

return self.head.data

else

: p = self.head

while index:

p = p.

next

index -=

1return p.data

# 獲取鍊錶長度

defget_length

(self)

:return self.length

# 清空鍊錶

defclear

(self)

: self.head =

none

self.length =

0# 列印鍊錶

defprintlist

(self)

:if self.length ==0:

return

none

else

: p = self.head

while p.

next

:print

(p.data,

'-->'

, end='')

p = p.

next

print

(p.data)

if __name__ ==

'__main__'

: s = linkedlist(

) node1 = listnode(1)

node2 = listnode(2)

node3 = listnode(3)

s.printlist(

) s.insert(node3,0)

s.printlist(

) s.delete(0)

s.printlist(

)

資料結構與演算法之鍊錶

鍊錶的分類 1 單鏈表 頭插法 只需要維護乙個頭結點即可,常用來模擬堆疊 尾插法 需要維護頭結點和尾結點,常用來模擬佇列。2 雙向鍊錶 雙向遍歷,可以用來儲存網頁的歷史記錄等 3 迴圈鍊錶 經常出現在面試題中,判斷鍊錶是否有環。鍊錶的刪除 方式一 維護兩個指標,current 表示當前節點 和pre...

資料結構與演算法之 靜態鍊錶

staticlinkedlist.h 靜態鍊錶 typedef int elemtype define maxsize 20 typedef struct component,staticlinkedlist maxsize define ok 1 define error 0 typedef in...

資料結構與演算法之美 鍊錶

如何優雅的寫出鍊錶 6大學習技巧 一 理解指標或引用的含義1.含義 將某個變數 物件 賦值給指標 引用 實際上就是就是將這個變數 物件 的位址賦值給指標 引用 2.示例 p next q 表示p節點的後繼指標儲存了q節點的記憶體位址。p next p next next 表示p節點的後繼指標儲存了p...