反轉乙個單鏈表。
示例:
輸入: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 實現...