61. 旋转链表

61. 旋转链表

题意

给定一个链表,旋转链表,将链表每个节点向右移动 k 个位置,其中 k 是非负数;

解题思路

快的先移动k个结点,然后再让慢的和快的一起移动,最后慢的就可以到达倒数第k个结点,最后将快的指向慢的即可,然后再移动这里需要注意的是,如果k超出链表长度的话,有两种情况,如果是能整除的话,则和原来一样,如果不能整除的,则按照题目要求旋转链表。

实现

class Solution(object):
   def rotateRight(self, head, k):
       """
      :type head: ListNode
      :type k: int
      :rtype: ListNode
      """
       if not head or k == 0:
           return head
       
       # 计算链表长度,用于计算旋转的位置,比如超出链表长度
       temp = head
       le = 0
       while temp:
           le += 1
           temp = temp.next
           
       if k >= le:
           k %= le
         
       if k == 0:
           return head
       else:
           slow, fast = head, head
           for _ in range(k):
               fast = fast.next

           pre_slow, pre_fast = slow, fast
           while fast:
               pre_slow, pre_fast = slow, fast
               slow, fast = slow.next, fast.next

           pre_slow.next = None
           if pre_fast:
               pre_fast.next = head

           return slow
posted @ 2017-09-11 21:32  banananana  阅读(125)  评论(0编辑  收藏  举报