Python實現資料結構與演算法 反轉鍊錶

2021-10-23 03:33:07 字數 2821 閱讀 1494

反轉乙個單鏈表。

示例:

輸入:1-

>2-

>3-

>4-

>5-

>null

輸出:5

->4-

>3-

>2-

>1-

>null

高階:

你可以迭代或遞迴地反轉鍊錶。你能否用兩種方法解決這道題?

思路1:迭代

假設有鍊錶1->2->3->4->5->none,

反轉後得none

這個過程相當於,在遍歷鍊錶的過程中,每乙個當前節點的next,由原來的指向下乙個改為指向前乙個。

舉例來說:

如果當前節點是2,那麼他的下乙個節點是3,前乙個節點是1

也就是,由原來的2->3改為了2->1。這個過程看似簡單,但是實際操作時,需要輔助變數。

方便分析,以1->2->3->none為例:

當1為當前節點時,1需要指向它的前乙個節點,這裡指向none。所以,完成這個過程後,此時鍊錶實際上是:

none3->none

顯然,如果想繼續遍歷鍊錶,需要將當前節點cur由1變為2,但是因為1的next已經指向none,無法指向2。這時就需要通過賦值的方法將當前節點指定為2。這需要先將節點2獲得並且儲存,然後在將其賦給cur。節點2在反轉操作之前,可以通過cur.next獲得。在這裡,可以將變數設為nextnode。則在nextnode = cur.next。這樣在一系列反轉後,將cur = nextnode,就可以達到繼續遍歷的目的。

繼續遍歷,當cur為節點2時,此時鍊錶依然是none3->none,這時的操作是2的下乙個節點需要指向1,而1和2之間沒有聯絡,依然需要通過賦值來實現。這就需要在上一步過程中,有乙個變數可以儲存節點1。用prevnode儲存,則在上一步中,prevnode = cur,即當前節點就是下乙個節點的前置節點。

有了nextnode和prevnode,整個過程就可以描述為:

# definition for singly-linked list.

# class listnode:

# def __init__(self, x):

# self.val = x

# self.next = none

class

solution

:def

reverselist

(self, head: listnode)

-> listnode:

ifnot head or

not head.

next

:return head

cur = head

prevnode =

none

nextnode =

none

while cur:

nextnode = cur.

next

cur.

next

= prevnode

prevnode = cur

cur = nextnode

return prevnode

執行結果:

時間複雜度:o(n),假設n是列表的長度,時間複雜度是 o(n)。

空間複雜度:o(1)。

思路2:遞迴

假設1->2->3->4->5,如果其中部分鍊錶已經實現反轉,比如:1->2->3none。那麼,當實現2和3之間的反轉,只需要完成讓3的next指向2,2的next指向none。

head_r = f(),表示子鍊錶已經實現反轉

cur.next.next = cur

cur.next = none

**如下:

# definition for singly-linked list.

# class listnode:

# def __init__(self, x):

# self.val = x

# self.next = none

class

solution

: fake_head = listnode(-1

)def

reverselist

(self, head: listnode)

-> listnode:

ifnot head or

not head.

next

:return head

head_r = self.reverselist(head.

next

) head.

next

.next

= head

head.

next

=none

return head_r

執行結果:

時間複雜度:o(n),假設 nn 是列表的長度,那麼時間複雜度為 o(n)。

空間複雜度:o(n),由於使用遞迴,將會使用隱式棧空間。遞迴深度可能會達到n層。

這道題將鍊錶反轉理解成1逐漸向後,每次下乙個節點都新增到head,就麻煩了。比如,1->2->3,1到2後,2到頭,然後1到3後,3到頭。這種思路的迭代會變得十分複雜。這道題遞迴的思路不是最優解,但是遞迴的思路很鍛鍊邏輯思維能力。

python資料結構與演算法

coding utf 8 import sys 使用以下語句將引數的str格式轉換為int格式 l list map int sys.argv 1 split target int sys.argv 2 def binarysearch print l print target left 0 rig...

資料結構與演算法 python

元類 基礎 冒泡 它重複地走訪要排序的數列,一次比較兩個元素,如果他們的順序錯誤就把他們交換過來。走訪數列的工作是重複地進行直到沒有再需要交換,也就是說該數列已經排序完成。這個演算法的名字由來是因為越小的元素會經由交換慢慢 浮 到數列的頂端,故名氣泡排序。def bubble sort alist ...

python演算法與資料結構

若n1 n2 n3 1000,且n1平方 n2平方 n3平方 n1,n2,n3為自然數 求出所有n1 n2 n3可能的組合?n1 0 n2 0 n3 0 判斷n1 n2 n3是否等於1000,之後變n3 1,n3 2,n3 3,然後再變n2 那如果變為 n1 n2 n3 2000 了呢?思路1 實現...