给定一个链表,旋转链表,将链表每个节点向右移动 k 个位置,其中 k 是非负数。
示例 1:
输入: 1->2->3->4->5->NULL, k = 2
输出: 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个节点,将其移动到链表的开头,如果k大于链表长度,那么对其取模即可。
# @lc code=start
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution:
def rotateRight(self, head: ListNode, k: int) -> ListNode:
if head==None or head.next==None:
return head
prob = head
counter = 1
while prob.next!=None:
counter += 1
prob = prob.next
# 将链表闭合
prob.next = head
# 将指针指向闭合的链表
prob_new = head
# 每循环counter次将变回原样,所以只需考虑k%counter的模
if k>=counter:
k = k%counter
# 将闭合的链表在counter-k-1处断开
for i in range(counter-k-1):
prob_new = prob_new.next
new_head = prob_new.next
# 断开
prob_new.next = None
return new_head
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution:
def rotateRight(self, head: ListNode, k: int) -> ListNode:
if head==None:
return head
h = ListNode(-1)
h.next = head
prob = h
prob1 = h
counter = 0
while prob.next!=None:
counter += 1
prob = prob.next
# print(counter)
if k>counter:
k = k % counter
for i in range(counter-k):
prob1 = prob1.next
# print(prob1)
temp = prob1.next
# print(temp)
prob1.next = None
# print(h)
prob2 = temp
hh = ListNode(-1)
hh.next = temp
prob2 = hh
while prob2.next!=None:
prob2 = prob2.next
prob2.next = h.next
return hh.next