题目分析:
反转从位置 m 到 n 的链表。请使用一趟扫描完成反转。说明:1 ≤ m ≤ n ≤ 链表长度。
示例:
输入: 1->2->3->4->5->NULL, m = 2, n = 4
输出: 1->4->3->2->5->NULL
解题思路:
分成三段考虑,反转前段,反转段,反转后段
- 反转前段,我们只需要标记记录反转点即可
实现代码
while i < m:
pre_head = head
head = head.next
i += 1
- 反转段基本思路如下
实现代码
while i < n + 1:
tmp = head.next
head.next = new_head
new_head = head
head = tmp
i += 1
- 经过反转后head指向反转最后的位置,接下来把三段连接起来就可以了
实现代码
if pre_head:
pre_head.next = new_head
tial.next = head
提交代码:(Runtime: 36 ms, faster than 81.39% ,可直接运行测试的代码见下测试代码)
class Solution:
def reverseBetween(self, head: ListNode, m: int, n: int) -> ListNode:
bf_head = head
i = 1
pre_head = None
#反转前
while i < m:
pre_head = head
head = head.next
i += 1
#反转段
new_head = None
tial = head
while i < n + 1:
tmp = head.next
head.next = new_head
new_head = head
head = tmp
i += 1
#反转后段
if pre_head:
pre_head.next = new_head
else:
bf_head = new_head
tial.next = head
return bf_head
测试代码:(可直接运行用于测试)
# Definition for singly-linked list.
class ListNode:
def __init__(self, x):
self.val = x
self.next = None
def print_listNode(listNode: ListNode):
if not listNode:
print(None)
return
bf_listNode = listNode
while bf_listNode.next:
print(bf_listNode.val, end='-->')
bf_listNode = bf_listNode.next
print(bf_listNode.val)
def creat_listNode(nums: list):
if not nums: return None
bf_head = head = ListNode(nums[0])
for i in range(1, len(nums)):
head.next = ListNode(nums[i])
head = head.next
head.next = None
return bf_head
class Solution:
def reverseBetween(self, head: ListNode, m: int, n: int) -> ListNode:
bf_head = head
i = 1
pre_head = None
#反转前
while i < m:
pre_head = head
head = head.next
i += 1
#反转段
new_head = None
tial = head
while i < n + 1:
tmp = head.next
head.next = new_head
new_head = head
head = tmp
i += 1
#反转后段
if pre_head:
pre_head.next = new_head
else:
bf_head = new_head
tial.next = head
return bf_head
print_listNode(Solution().reverseBetween(creat_listNode([1,2,3,4,5]),2,4))