# Definition for singly-linked list. # class ListNode: # def __init__(self, val=0, next=None): # self.val = val # self.next = next # pre初始指向空,p指向当前待处理节点,初始为head,q记录p的下一个节点 # p连上上一个节点pre,pre变为当前节点p,p后移指向下一个待处理节点q # 结束时,p为空,pre为最后被处理的节点,即新链表的头节点 classSolution: defreverseList(self, head: ListNode) -> ListNode: ifnot head: return head pre = None p = head while p: q = p.next p.next = pre pre = p p = q return pre
方法三:迭代求解
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
# Definition for singly-linked list. # class ListNode: # def __init__(self, val=0, next=None): # self.val = val # self.next = next # 以第一个节点为未反转部分,剩下部分为已求解部分 # 第二个节点为已求解部分最后的一个节点,将最后一个未反转节点加入已求解部分 # 注意两点:1. head.next为空需要提前判断,否则有语法错误 2.最终一个节点的next为None classSolution: defreverseList(self, head: ListNode) -> ListNode: ifnot head ornot head.next: return head right = self.reverseList(head.next) head.next.next = head head.next = None return right
Golang
C
C++
92. 反转链表 II
给你单链表的头指针 head 和两个整数 left 和 right ,其中 left <= right 。请你反转从位置 left 到位置 right 的链表节点,返回 反转后的链表 。
# Definition for singly-linked list. # class ListNode: # def __init__(self, val=0, next=None): # self.val = val # self.next = next classSolution: defreverseBetween(self, head: ListNode, left: int, right: int) -> ListNode: # head为第一个要处理的节点,tail为要处理节点的下一个节点,可能为None defreverseList(head, tail): prev = tail cur = head p = head while p != tail: p = p.next cur.next = prev prev = cur cur = p return prev
dummy = ListNode(next=head) p = dummy count = 0 prev_node = dummy right_node = None while p: if count == left-1: prev_node = p if count == right: right_node = p break p = p.next count += 1 # print(prev_node.val, right_node.val) ifnot right_node: prev_node.next = reverseList(prev_node.next, None) else: prev_node.next = reverseList(prev_node.next, right_node.next) return dummy.next