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

【题目】

  给定一个单向链表的头节点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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值