題目:
定義乙個函式,輸入乙個鍊錶的頭節點,反轉該鍊錶並輸出反轉後鍊錶的頭節點。
示例:
輸入: 1->2->3->4->5->null
輸出: 5->4->3->2->1->null
限制:
0 <= 節點個數 <= 5000
思路:
思路一:利用外部空間
新建乙個列表,遍歷鍊錶的同時將鍊錶儲存到列表中
然後使用pop將鍊錶從後往前彈出,然後達到反轉鍊錶的目的。
class
solution
:def
reverselist
(self, head):if
not head:
return
none
res =
#定義列表,遍歷鍊錶的同時將其存入列表
while head.
next
: head = head.
next
# 此時head指向列表的最後乙個值
#定義乙個新的temp作為新的頭指標,將其指向列表的最後乙個值,準備進行pop操作
temp = head
#對列表進行彈出操作,形成乙個新的鍊錶
while res:
node = res.pop(
) node.
next
= temp.
next
temp.
next
= node
temp = node
return head
方法二:
思路:
申請兩個指標,第乙個指標叫 pre,最初是指向 null 的。
第二個指標 cur 指向 head,然後不斷遍歷 cur。
每次迭代到 cur,都將 cur 的 next 指向 pre,然後 pre 和 cur 前進一位。
都迭代完了(cur 變成 null 了),pre 就是最後乙個節點了。
動畫演示如下:
class solution(object):
def reverselist(self, head):
if not head:
return
# 需要兩個指標同時移動來對每兩個節點之間的方向進行轉向處理
pre_node = none
cur_node = head
# 遍歷整個鍊錶
while cur_node:
# 因為要斷開當前節點跟下個節點的連線,這樣就無法通過next指標找到下個節點了
# 所以需要使用乙個臨時變數來儲存當前節點的下個節點
tmp = cur_node.next
# 斷開當前節點跟下個節點的連線,使其跟上個節點進行連線,這樣next的方向就改變了
cur_node.next = pre_node
# 同時移動兩個指標,以便進行下乙個節點的反向
pre_node = cur_node
cur_node = tmp
return pre_node
鍊錶的翻轉
如何快速的實現鍊錶的翻轉,比如鍊錶a資料為 str1,str2,str3,str4,str5,str6 翻轉後則變為 str6,str5,str4,str3,str2,str1 針對上述問題我能想到的一種辦法就是以壓棧的方式來實現,其實現思路相對較為簡單,通過定義乙個鍊錶資料結構的資料棧,遍歷鍊錶,...
分析鍊錶翻轉
鍊錶翻轉分兩部分,鍊錶整表翻轉和鍊錶部分翻轉。下面討論非遞迴的做法,遞迴的做法以後有空再說。先說鍊錶整表翻轉,核心四句話 next p.next p.next pre pre p p next 顧名思義,pre是p前面的節點,next是p後面的節點。舉個例子,下圖是乙個鍊錶節點翻轉前的狀態 上面的 ...
鍊錶部分翻轉
題目描述 給定乙個鍊錶,翻轉該鍊錶從m到n的位置。要求直接翻轉而非申請新空間。如 給定1 2 3 4 5,m 2,n 4,返回1 4 3 2 5。假定給出的引數滿足 1 m n 鍊錶長度。時間複雜度為o n 以下為 include include typedef struct snode snode...