天天看點

jdk8 list 反轉_連結清單反轉,此生相伴

第281篇原創作品

你是否有過這種體會:看别人的代碼,當時看得很明白了,但是,過段時間,自己卻怎麼都寫不出來?這是怎麼回事,可能我們也清楚。别人的思維你是無法拷貝的,形成之前不具備的思維,刻入骨髓,需要天長日久的思維訓練。

leetcode有多重要,無需多言,刷過leetcode的小夥伴,都有以上這些體會。自己想不出來,看完别人的代碼,也都看懂了,但是日後再做此題,可能還是搞不定。

就拿連結清單反轉來說,基本是面試的必考題,就是這道題,如果平時沒有這方面的訓練,思維沒有培養起來,也很難在幾分鐘内準确寫出來,不信你現在試試。像這類道題,可能伴随我們整個技術生涯,不分職位高低,它就像水和空氣,是程式員應該信手拈來的。

可能還是有些小夥伴,覺得連結清單等這類知識,自己根本用不到,學這些幹啥。亮出一個高逼格的理由,它們會讓你coding的思維,更上一層樓。

平常人進階就得,多思考,多動手,多總結。我也順手再檢測一下,連結清單反轉,我們走起。

疊代版思考過程:

設變量curhead始終指向反轉後連結清單的頭部,初始時val等于輸傳入連結表頭的val, next為None, 即隻有1個節點。

jdk8 list 反轉_連結清單反轉,此生相伴

此時,原連結清單頭自然指向了第二個節點prehead(如果存在的話),同時,我們标記其後的節點為tmp,因為接下來我們要破壞prehead的next域,叫它指向我們反轉後的新連結清單頭curhead, 是以标記tmp是再自然不過的了。

jdk8 list 反轉_連結清單反轉,此生相伴
jdk8 list 反轉_連結清單反轉,此生相伴

一旦prehead的next域到curhead建立後,我們新連結清單就增加了1個節點,正是讓curhead指向這個新增節點。

jdk8 list 反轉_連結清單反轉,此生相伴

作為疊代,此時我們的prehead就要指向一開始我們标記的tmp了,至此一輪疊代,完美就緒。

jdk8 list 反轉_連結清單反轉,此生相伴

明白以上過程,疊代版本的代碼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

jdk8 list 反轉_連結清單反轉,此生相伴

疊代過程動畫示範

下一次,如果再有人問你類似題目,好好給他展示一遍。

推薦閱讀:

如何拿下10個算法工程師offer,不可錯過!

Python繪制玫瑰和佩奇

Python資料分析學習路線個人總結

jdk8 list 反轉_連結清單反轉,此生相伴

Python與算法社群

 點個好看