python程式設計練習 三種方法實現鍊錶的逆序

2021-10-08 00:07:14 字數 3770 閱讀 2054

#鍊錶的儲存特點:可以用任意一組儲存單元來儲存單鏈表中的資料元素,而且除了儲存每個資料元素外,還必須儲存

#指示其直接後繼元素的資訊

#實現鍊錶的逆序

#方法1:就地逆序

#在遍歷鍊錶的時候,修改當前結點指標域的指向,讓其指向它的前驅結點。需要用乙個指標變數來儲存前驅結點的位址,

#此外為了在調整當前結點指標域的指向後還能找到後繼結點還需要另外乙個指標變數來儲存後繼結點的位址,在所有結點

#都被儲存好以後就可以直接完成指標的逆序,還需要注意鍊錶首尾結點的特殊處理

class

lnode

(object)

: def __init__

(self,x=none)

: self.data = x

self.next = none

#這裡需要注意的是需要為x賦值none,以及函式名為__init__

#否則可能出現的報錯

#typeerror:

__new__

() missing 1 required positional argument:

'x'#attributeerror:

'nonetype' object has no attribute 'next'

def reverse

(head)

: #判斷鍊錶是否為空

if head == none or head.next == none or head.next.next == none:

return

pre = none#前驅結點

cur = none#當前結點

next = none#後繼結點

#把鍊錶首結點變成尾結點

cur = head.next

next = cur.next

cur.next = none

pre = cur

cur = next

#使當前遍歷到的結點指向前結點

while cur.next != none:

next = cur.next

cur.next = pre

pre = cur

cur = cur.next

cur = next

#鍊錶最後乙個結點指向倒數第二個結點

cur.next = pre

#鍊錶的頭節點指向原來鍊錶的尾結點

head.next = cur

#方法2:遞迴,對不帶頭結點的單鏈表進行逆序

#假定原煉表為1

->2-

>3-

>4-

>5-

>6-

>

7,遞迴法的主要思路為:先逆序除第乙個結點以外的子鍊錶

#將1-

>2-

>3-

>4-

>5-

>6-

>

7變為1

->7-

>6-

>5-

>4-

>3-

>

2#接著把結點1新增到逆序的子鍊錶的後面,1

->7-

>6-

>5-

>4-

>3-

>

2變為7

->6-

>5-

>4-

>3-

>2-

>

1#同理在逆序鍊錶2

->3-

>4-

>5-

>6-

>

7時,也是先逆序子鍊錶3

->4-

>5-

>6-

>

7def recursivereverse

(head)

: #如果鍊錶為空或者鍊錶中只有乙個元素

if head is none or head.next is none:

return head

else

: #反轉後面的結點

newhead =

recursivereverse

(head.next)

head.next.next=head

head.next = none

return newhead

#對帶頭結點的單鏈表進行逆序

def reverse2

(head)

:if head is none:

return

#獲取鍊錶第乙個結點

firstnode = head.next

#對鍊錶進行逆序

newhead =

recursivereverse

(firstnode)

#頭結點指向逆序後鍊錶的第乙個結點

head.next = newhead

return newhead

#方法3:插入法,從鍊錶的第二個結點開始,把遍歷到的結點插入到頭結點的後面,知道遍歷結束

#假定原煉表為head-

>1-

>2-

>3-

>4-

>5-

>6-

>

7,在遍歷到2的時候,將其插入到頭結點後,鍊錶變為head-

>2-

>1-

>3-

>4-

>5-

>6-

>

7#同理將後續遍歷到的所有結點都插入到頭結點head後,就可以實現鍊錶的逆序

def reverse3

(head)

: #判斷鍊錶是否為空

if head is none or head.next is none:

return

cur = none#當前結點

next = none#後繼結點

cur = head.next.next

#設定鍊錶第乙個結點為尾結點

head.next.next = none

#把遍歷到結點插入到頭結點的後面

while cur is not none:

next = cur.next

cur.next = head.next

head.next = cur

cur = next

if __name__ ==

"__main__"

: i =

1 #煉表頭結點

head =

lnode()

head.next = none

tmp = none

cur = head

#構造單鏈表

while i <8:

tmp =

lnode()

tmp.data = i

tmp.next = none

cur.next = tmp

cur = tmp

i +=

1print

("逆序前:"

) cur = head.next

while cur != none:

print

(cur.data)

cur = cur.next

print

("\n逆序後:"

)reverse

(head)

cur = head.next

while cur != none:

print

(cur.data)

cur = cur.next

python類的三種方法

python類有三種方法。1.一般方法,即不加任何修飾的,直接用def定義的方法。如 in 14 class a def a self print 一般方法 in 15 class a a in 16 class a.a 一般方法2.staticmethod方法 經過staticmethod修飾過的...

python列表逆序三種方法

栗子 題目 將乙個陣列逆序輸出。程式分析 用第乙個與最後乙個交換。import random list random.randint 0,100 for in range 21 print list 數應該先排序 defbubblesort arr for i in range 1,len arr ...

三種方法 2020 11 23

利用連線類,例項化得到連線物件 連線類 連線物件 new 連線類 cmd.executescalar cmd.excutereader 關注其中一條資料 物件名.read 獲取關注列所對應的值 console.writeline 物件名 name while 物件名.read 功能,聚焦下一行資料。...