题目描述:
反转从位置 m 到 n 的链表。请使用一趟扫描完成反转。
说明:1 ≤ m ≤ n ≤ 链表长度。
知识点:
在扫描链表的过程中记录m与n两个节点位置
思路和代码:
class ListNode:
def __init__(self, x):
self.val = x
self.next = None
class Solution:
def reverseBetween(self, head: ListNode, m: int, n: int) -> ListNode:
# head只有一个节点或为空时不能反转,直接返回head
if head == None or head.next == None:
return head
# m=1表示反转前n个节点,直接调用reverse(head,n)
if m == 1:
head = self.reverse(head, n)
else:
i = 1
m_node = head
while m_node.next:
# 找到并记录第m个节点的前一个节点,用于连接后续反转得到的节点
if i == m - 1:
break
m_node = m_node.next
i += 1
m_node.next = self.reverse(m_node.next, n + 1 - m)
return head
def reverse(self, head, num):
# 反转前num个节点
if head == None or head.next == None or num<=1:
return head
# 创建反转后的尾节点,用于连接后续节点
n_node = ListNode(head.val)
first_head = n_node
head = head.next
i = 2
while i <= num:
# 到达了链表尾部
if head == None:
break
#将当前遍历的节点插入新建的链表头部
first_head = self.insert(first_head, head.val)
head = head.next
i += 1
# 连接后续节点
n_node.next = head
return first_head
def insert(self, head, x):
# 在头节点插入节点
temp_node = ListNode(x)
temp_node.next = head
return temp_node