题目:
给你单链表的头指针 head 和两个整数 left 和 right ,其中 left <= right 。请你反转从位置 left 到位置 right 的链表节点,返回 反转后的链表 。
示例:
输入:head = [1,2,3,4,5], left = 2, right = 4
输出:[1,4,3,2,5]
思路:
遍历链表,找到要反转的部分,进行反转,标记要反转链表的左右节点,后边反转完了要再接上链表。具体过程是初始化四个指针,分别指向左节点和左节点的左边一个,右节点和右节点的右边一个,对左右节点中间的部分进行反转操作,然后如果p1存在,p1接上p3,否则p3作为头节点,p2连上p4,返回链表即可。
设置虚拟头节点prehead的目的是,万一反转后原来的头节点变了,不用另外写逻辑。
考虑特殊情况:
如果链表为空,代码中包括这种情况,直接返回空。
如果链表只有一个节点,返回这个节点。
如果左边缘是1,那么p1就是空的,虚拟头节点连接p3,如果左边缘是链表长度,包括在代码中的正常操作。
如果右边缘是1,直接返回原链表,如果右边缘是链表长度,包括在代码中的正常操作。
# Definition for singly-linked list.
# class ListNode(object):
# def __init__(self, val=0, next=None):
# self.val = val
# self.next = next
class Solution(object):
def reverseBetween(self, head, left, right):
"""
:type head: ListNode
:type left: int
:type right: int
:rtype: ListNode
"""
if right == 1 or not head.next:
return head
prehead = ListNode(0)
prehead.next = head
pre = None
cur = head
i = 0
p1 = p2 = p3 = p4 = None
while cur:
i += 1
next = cur.next
if left < i <= right:
cur.next = pre
if i == left-1:
p1 = cur
if i == left:
p2 = cur
if i == right:
p3 = cur
if i == right + 1:
p4 = cur
pre = cur
cur = next
if not p1:
prehead.next = p3
else:
p1.next = p3
p2.next = p4
return prehead.next