2.5 反转部分单向链表

Posted latup

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2.5 反转部分单向链表相关的知识,希望对你有一定的参考价值。

题目:给定一个单向链表的头节点head,以及两个整数from和to,在单向链表上把第from个节点到第to个节点这一部分进行反转  

  例如:

  1 --> 2 --> 3 --> 4 --> 5 --> null, from=2, to=4

  调整结果为: 1 --> 4 --> 3 --> 2 --> 5 --> null

  再如:

  1 --> 2 --> 3 --> null, from=1, to=3

  调整结果为:3 --> 2 --> 1 --> null

要求:

  1. 如果链表长度为N,时间复杂度要求为O(N),额外空间复杂度要求为O(1)

  2. 如果不满足,1<=from<=to<=N,则不用调整

 

My:

 1 def reversePart(L, _from, to):
 2     if _from < 1 or _from > to or to > L.length:
 3         return
 4     p = L.head
 5     # 找到待反转链表的开始部分
 6     count = 1
 7     while count < _from:
 8         p = p.next_item
 9         count += 1
10     q = p
11     # 反转部分单向链表
12     pre = p
13     p = p.next_item
14     next = None
15     while count <= to:
16         next = p.next_item
17         p.next_item = pre
18         pre = p
19         p = next
20         count += 1
21     # 将原链表与反转的部分链表连接起来
22     q.next_item.next_item = p
23     q.next_item = pre

 

Reference:

 1 def reversePart(L, _from, to):
 2     count = 0
 3     fpre = None
 4     tpos = None
 5     p = L.head
 6     # 找到待反转链表的前驱节点和后继节点
 7     while(p != None):
 8         fpre = p if count==_from-1 else fpre
 9         tpos = p if count==to+1 else tpos
10         count += 1
11         p = p.next
12     if _from > to or _from < 1 or to > L.length:
13         return
14     pre = L.head if fpre==None else fpre.next
15     p = pre.next
16     pre.next = tpos
17     next = None
18     while p != tpos:
19         next = p.next
20         p.next = pre
21         pre = p
22         p = next
23     if fpre != None:
24         fpre.next = pre

 

以上是关于2.5 反转部分单向链表的主要内容,如果未能解决你的问题,请参考以下文章

反转部分单向链表

算法总结之 反转部分单向链表

链表的java实现(单向双向链表,单向链表的反转)

链表的java实现(单向双向链表,单向链表的反转)

算法总结之 反转单向和双向链表

单向链表反转