第281篇原創作品
你是否有過這種體會:看别人的代碼,當時看得很明白了,但是,過段時間,自己卻怎麼都寫不出來?這是怎麼回事,可能我們也清楚。别人的思維你是無法拷貝的,形成之前不具備的思維,刻入骨髓,需要天長日久的思維訓練。
leetcode有多重要,無需多言,刷過leetcode的小夥伴,都有以上這些體會。自己想不出來,看完别人的代碼,也都看懂了,但是日後再做此題,可能還是搞不定。
就拿連結清單反轉來說,基本是面試的必考題,就是這道題,如果平時沒有這方面的訓練,思維沒有培養起來,也很難在幾分鐘内準确寫出來,不信你現在試試。像這類道題,可能伴随我們整個技術生涯,不分職位高低,它就像水和空氣,是程式員應該信手拈來的。
可能還是有些小夥伴,覺得連結清單等這類知識,自己根本用不到,學這些幹啥。亮出一個高逼格的理由,它們會讓你coding的思維,更上一層樓。
平常人進階就得,多思考,多動手,多總結。我也順手再檢測一下,連結清單反轉,我們走起。
疊代版思考過程:
設變量curhead始終指向反轉後連結清單的頭部,初始時val等于輸傳入連結表頭的val, next為None, 即隻有1個節點。
此時,原連結清單頭自然指向了第二個節點prehead(如果存在的話),同時,我們标記其後的節點為tmp,因為接下來我們要破壞prehead的next域,叫它指向我們反轉後的新連結清單頭curhead, 是以标記tmp是再自然不過的了。
一旦prehead的next域到curhead建立後,我們新連結清單就增加了1個節點,正是讓curhead指向這個新增節點。
作為疊代,此時我們的prehead就要指向一開始我們标記的tmp了,至此一輪疊代,完美就緒。
明白以上過程,疊代版本的代碼1分鐘寫出來,就不是問題。
# 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:
if head is None:
return None
curhead = ListNode(head.val)
prehead = head.next
while prehead is not None:
tmp = prehead.next
prehead.next = curhead
curhead = prehead
prehead = tmp
return curhead
疊代過程動畫示範
下一次,如果再有人問你類似題目,好好給他展示一遍。
推薦閱讀:
如何拿下10個算法工程師offer,不可錯過!
Python繪制玫瑰和佩奇
Python資料分析學習路線個人總結
Python與算法社群
點個好看