# Definition for singly-linked list. # class ListNode: # def __init__(self, val=0, next=None): # self.val = val # self.next = next classSolution: defreverseList(self, head: Optional[ListNode]) -> Optional[ListNode]: cur, pre = head, None while cur: tmp = cur.next# 暂存后继结点 cur.next = pre # 修改 cur 后继结点的指向 pre = cur # pre 暂存 cur cur = tmp # cur 访问下一个节点
# Definition for singly-linked list. # class ListNode: # def __init__(self, val=0, next=None): # self.val = val # self.next = next classSolution: defreverseBetween(self, head: Optional[ListNode], left: int, right: int) -> Optional[ListNode]: # 反转链表函数 defreverse_linked_list(head: ListNode): pre = None cur = head while cur: next = cur.next cur.next = pre pre = cur cur = next # 使用虚拟头结点, 防止头结点发生变化,同时在遍历时更加方便 dummy_node = ListNode(-1) dummy_node.next = head pre = dummy_node # 第 1 步:从虚拟头节点走 left - 1 步,定位到 left 节点的前一个节点 for _ inrange(left-1): pre = pre.next # 第 2 步:从 pre 再走 right - left + 1 步,定位到 right 节点 right_node = pre for _ inrange(right - left + 1): right_node = right_node.next # 第 3 步:切断出一个子链表(截取链表) left_node = pre.next# 需要反转的链表的第一个节点 curr = right_node.next# 记录反转链表最后节点的后一个节点,用于反转后拼接 # 切断链表 pre.next = None# 反转链表的前一个节点 right_node.next = None# 反转链表的最后一个节点
# 用前半部分 和 反转之后的后半部分进行比较判断 ans = True first_index = head second_index = second_half_start while ans and second_index isnotNone: if first_index.val != second_index.val: ans = False first_index = first_index.next second_index = second_index.next
first_half_end.next = self.reverse_list(second_half_start) return ans
''' 慢指针一次走一步,快指针一次走两步,快慢指针同时出发。 当快指针移动到链表的末尾时,慢指针恰好到链表的中间。通过慢指针将链表分为两部分。 ''' defend_of_first_half(self, head): fast = head slow = head while fast.nextisnotNoneand fast.next.nextisnotNone: fast = fast.next.next slow = slow.next return slow
# 反转链表 defreverse_list(self, head): pre = None cur = head while cur: tmp = cur.next cur.next = pre pre = cur cur = tmp