给定一个链表,旋转链表,将链表每个节点向右移动 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
这道题的技巧是首先遍历链表,算出链表的长度,记录表头和表尾,然后将链表拉成一个循环链表,最后表头表尾一起移动
length-k%length次,最后要将循环链表表尾切断即可
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* rotateRight(ListNode* head, int k)
{
ListNode* current=head;
ListNode* tail =NULL;
if(head==NULL||head->next==NULL)
return head;
int length=1;
while(current->next)
{
current=current->next;
length++;
}
tail = current; // 记录表尾
int loop = length - k%length; // 循环次数
//current = head;
tail->next = head; // 连接为循环链表
for(int i=0;i<loop;i++)
{
head=head->next;
tail=tail->next;
}
tail->next = NULL;
return head;
}
};