反转部分单向链表

Posted dabric

tags:

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

题目描述:

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

  例如:

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

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

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

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

要求:

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

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

题目分析及解题思路:

  在对部分链表进行反转时,1-->2-->3-->4-->5-->null,from=2,to=4。我们要知道from-1的节点fPre,以及to+1处的节点tPos,这样,部分链表反转过程如下:

  fPre此时指向链表中的1,pre = fPre.next,将1节点的下一个节点赋为pre,pre的下一个节点赋为cur,那么此时链表的部分反转就和整条链表的反转过程相同,唯一不同的是将pre = tPos。

  问题解决的办法首先是要找到from的前一个节点和to的下一个节点。然后对from到to处的节点进行反转。最后还要判断的是:如果fPre = None的话,返回新链表的头节点即可,否则返回原来的头节点。

代码实现:

技术图片
 1 def reversePart(head, frm, to):
 2     cur = head
 3     fPre = None
 4     tPos = None
 5     length = 0
 6     while cur:
 7         length += 1
 8         if length == frm - 1:
 9             fPre = cur
10         else:
11             fPre = fPre
12         if length == to + 1:
13             tPos = cur
14         else:
15             tPos = tPos
16         cur = cur.next
17     if frm > to or frm < 1 or to > length:
18         return head
19     if fPre:
20         pre = fPre.next
21     else:
22         pre = head
23     cur = pre.next
24     pre.next = tPos
25     while cur != tPos:
26         next_ = cur.next
27         cur.next = pre
28         pre = cur
29         cur = next_
30     if fPre:
31         fPre.next = pre
32         return head
33     return pre
View Code

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

2.5 反转部分单向链表

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

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

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

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

单向链表反转