【题目】
给定一个单向链表的头节点head,以及两个整数start和end,在单向链表上把第start个节点到第end个节点这一部分进行反转。
例如:
1 -> 2 -> 3 -> 4 -> 5 -> null,start = 2,end = 4
调整结果为:1 -> 4 -> 3 -> 2 -> 5 -> null
再如:
1 -> 2 -> 3 -> null,start = 1,end = 3
调整结果为:3 -> 2 -> 1 -> null
【要求】
时间复杂度O(N),空间复杂度O(1)
如果不满足1 <= start <= end <= N,则不需要调整
【基本思路】
首先找到start的上一个节点,记为pre,end的下一个节点,记为pos。将start~end的节点反转,然后正确连接pre和pos即可。
需要注意的是,如果pre不存在,说明头节点也在反转的部分,此时返回新的头节点,也就是反转部分的最后一个节点;如果pre存在,说明头节点不在反转的部分,返回head即可。
【代码实现】
#python3.5
def reversePart(head, start, end):
if head == None or head.next == None:
return head
length = 0
pre = None
pos = None
node1 = head
while node1 != None:
length += 1
pre = node1 if length == start-1 else pre
pos = node1 if length == end+1 else pos
node1 = node1.next
if start > end or start < 1 or end > length:
return head
node1 = pre.next if pre != None else head
node2 = node1.next
node1.next = pos
while node2 != pos:
next = node2.next
node2.next = node1
node1 = node2
node2 = next
if pre != None:
pre.next = node1
return head
return node1