题目描述
给定一个链表,旋转链表,将链表每个节点向右移动 *k *个位置,其中 *k *是非负数。
示例 1:
**输出:** 4->5->1->2->3->NULL
**解释:**
向右旋转 1 步: 5->1->2->3->4->NULL
向右旋转 2 步: 4->5->1->2->3->NULL
示例 2:
输入:** 0->1->2->NULL, k = 4
**输出:** `2->0->1->NULL`
**解释:**
向右旋转 1 步: 2->0->1->NULL
向右旋转 2 步: 1->2->0->NULL
向右旋转 3 步: `0->1->2->NULL`
向右旋转 4 步: `2->0->1->NULL`
解体思路:
本题为链表的重新构造问题,链表指针的向右或者向左移动K步,首先要计算出移动后的头指针位置m。将头指针指向该位置m然后将链表的尾部指向初始状态的头部形成循环链表 ,最后再把位置m之前的节点的下一个指针指向NULL 作为结尾,构造完成。
头指针位置m的确定(计算):
如果向右移动比较简单只要将指针位置按照链表的方向移动K步如果到达队尾,则可以通过模运算 重新指向头部继续移动所以
m = k%lenList
如果方向做移动则稍微复杂 需要先用队列长度减去移动步数K后得到左移的位置 ,最后为了防止超出头尾部分也需要做一次摸操作公式如下:
m = (lenList - k%lenList)%lenList
程序代码
class Solution(object):
def rotateRight(self, head, k):
"""
:type head: ListNode
:type k: int
:rtype: ListNode
"""
if not head : return None
lenList = 0
p,ptmp = head,head;
while p :
p=p.next
lenList +=1
# m起始的位置
m = (lenList - k%lenList)%lenList
p = head
while m > 0 :
p=p.next
m-=1
head = p # 把头指针放到相应起始位置
while lenList>0 :
if not p.next:
p.next = ptmp
else:
p = p.next
lenList -=1
p.next = None
return head