題目描述
給定一個鏈表已亥,旋轉(zhuǎn)鏈表引镊,將鏈表每個節(jié)點(diǎn)向右移動 *k *個位置胸嘁,其中 *k *是非負(fù)數(shù)桂塞。
示例 1:
**輸出:** 4->5->1->2->3->NULL
**解釋:**
向右旋轉(zhuǎn) 1 步: 5->1->2->3->4->NULL
向右旋轉(zhuǎn) 2 步: 4->5->1->2->3->NULL
示例 2:
輸入:** 0->1->2->NULL, k = 4
**輸出:** `2->0->1->NULL`
**解釋:**
向右旋轉(zhuǎn) 1 步: 2->0->1->NULL
向右旋轉(zhuǎn) 2 步: 1->2->0->NULL
向右旋轉(zhuǎn) 3 步: `0->1->2->NULL`
向右旋轉(zhuǎn) 4 步: `2->0->1->NULL`
解體思路:
本題為鏈表的重新構(gòu)造問題凹蜂,鏈表指針的向右或者向左移動K步,首先要計(jì)算出移動后的頭指針位置m阁危。將頭指針指向該位置m然后將鏈表的尾部指向初始狀態(tài)的頭部形成循環(huán)鏈表 玛痊,最后再把位置m之前的節(jié)點(diǎn)的下一個指針指向NULL 作為結(jié)尾,構(gòu)造完成狂打。
頭指針位置m的確定(計(jì)算):
如果向右移動比較簡單只要將指針位置按照鏈表的方向移動K步如果到達(dá)隊(duì)尾擂煞,則可以通過模運(yùn)算 重新指向頭部繼續(xù)移動所以
m = k%lenList
如果方向做移動則稍微復(fù)雜 需要先用隊(duì)列長度減去移動步數(shù)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 # 把頭指針放到相應(yīng)起始位置
while lenList>0 :
if not p.next:
p.next = ptmp
else:
p = p.next
lenList -=1
p.next = None
return head