1. 題目描述
92.反轉鏈表 II
反轉從位置 m 到 n 的鏈表。請使用一趟掃描完成反轉。
說明:
1 ≤ m ≤ n ≤ 鏈表長度。
示例:
輸入: 1->2->3->4->5->NULL, m = 2, n = 4
輸出: 1->4->3->2->5->NULL
2. 代碼實現
整體思路:三個指針,進行插入操作
temp:需要進行翻轉的前一個節點的指針
left:需要進行翻轉的首節點指針
right:需要進行翻轉的節點的尾指針
例如:
1->2->3->4->5->NULL, m = 2, n = 4
temp爲起始至節點1,left爲節點2及以後,right節點爲3及以後,將節點3插入節點1和節點2之間,
變成: 1->3->2->4->5->NULL
此時,right變爲節點4及以後,left依然爲節點2及以後,再將節點4插入節點1和節點3之間
變成:1->4->3->2->5->NULL
實現翻轉的效果!
首先獲得temp:
temps = ListNode(-1)
temps.next = head
temp = temps
for i in range(m-1):
# 獲得第m-1個節點
temp = temp.next
然後獲得left和right:
left = temp.next
right = left.next
實現翻轉代碼:
for j in range(n-m):
# 步驟1
left.next = right.next
# 步驟2
right.next = temp.next
# 步驟3
temp.next = right
# 步驟4
right = left.next
翻轉算法的具體實現:
說一下我踩的雷(新手傷不起):
在寫代碼的過程中,將步驟2的代碼寫成了如下所示導致輸出結果爲:[1,4,2,5]
for j in range(n-m):
# 步驟1
left.next = right.next
# 步驟2
right.next = left
# 步驟3
temp.next = right
# 步驟4
right = left.next
將數據過一遍就會發現:
第一次循環:1->3->2->4->5->NULL
第二次循環:1->4->2->5->NULL
第二次循環時,left爲2,right爲4, right.next = left執行後爲4->2,temp.next = right執行後爲1->4。
最後完整的實現代碼爲:
class Solution(object):
def reverseBetween(self, head, m, n):
"""
:type head: ListNode
:type m: int
:type n: int
:rtype: ListNode
"""
temps = ListNode(-1)
temps.next = head
temp = temps
for i in range(m-1):
# 獲得第m-1個節點
temp = temp.next
# right = temp.next
left = temp.next
right = left.next
for j in range(n-m):
# 步驟1
left.next = right.next
# 步驟2
right.next = temp.next
# 步驟3
temp.next = right
# 步驟4
right = left.next
return temps.next