小黑享受思考心流躲避迷茫:92. 反转链表 II
小黑代码1:两次遍历
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, val=0, next=None):
# self.val = val
# self.next = next
class Solution:def reverseBetween(self, head: Optional[ListNode], left: int, right: int) -> Optional[ListNode]:if left==right:return head# 设置辅助头结点temp = ListNode(next=head)# 当前指针cur = temp# 计数器t = 0# 先定位left的前驱结点和right结点left_pre_node = tempright_node = headwhile cur:cur = cur.nextt += 1if t == left-1:left_pre_node = curelif t == right:right_node = curbreak# 开始逆转left_node = left_pre_node.nextpre = left_nodecur = left_node.nextaft = cur.next# 记录片段最后的结点right_aft_node = right_node.next# 逆转链表while cur!=right_aft_node:cur.next = prepre = curcur = aftif not aft:breakaft = aft.next# 处理首尾问题left_node.next = right_aft_nodeleft_pre_node.next = right_nodereturn temp.next
小黑尝试穿针引线法
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, val=0, next=None):
# self.val = val
# self.next = next
class Solution:def reverseBetween(self, head: Optional[ListNode], left: int, right: int) -> Optional[ListNode]:if left==right:return head# 辅助头结点temp = ListNode(next=head)# 找到片段左边结点的前驱结点pre = tempt = 0while t<left-1:pre = pre.nextt += 1start_node = pre.nextt += 2cur = start_node.next# 开始逆转片段while t <= right:aft = cur.nexttemp2 = pre.nextpre.next = curcur.next = temp2start_node.next = aftcur = aftt += 1return temp.next
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, val=0, next=None):
# self.val = val
# self.next = next
class Solution:def reverseBetween(self, head: Optional[ListNode], left: int, right: int) -> Optional[ListNode]:if left==right:return head# 辅助头结点temp = ListNode(next=head)# 找到片段左边结点的前驱结点pre = tempt = 0while t<left-1:pre = pre.nextt += 1start_node = pre.nextt += 2# 开始逆转片段while t <= right:aft = start_node.nextstart_node.next = aft.nextaft.next = pre.nextpre.next = aftt += 1return temp.next