链表问题---反转部分单向链表

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_34342154/article/details/78223254

【题目】

  给定一个单向链表的头节点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
展开阅读全文

没有更多推荐了,返回首页