leetcode:单链表之Rotate List
题目:
Given a list, rotate the list to the right by k places, where k is non-negative.
For example:
Given 1->2->3->4->5->nullptr and k = 2, return 4->5->1->2->3->nullptr.
即:给出一个单链表,和一个K值,根据K值往右旋转。
分析:这里的k可能是比链表长度要大的数字,因此实际旋转的位置通过k= len - k % len来获得;
输入;
当k=1时,旋转后结果:
当k=2时,旋转后结果:
当k=3时,旋转后结果:
当k=4时,旋转后结果:
当k=5时,旋转后结果:
当k=6时,旋转后结果:
...
c++实现:
#include <iostream>
using namespace std;
struct ListNode
{
int val;
ListNode *next;
ListNode (int x):val(x),next(NULL){ }
};
ListNode *createListNode(int arr[],int n)
{
ListNode *r;
ListNode *p;
ListNode * L=(ListNode*)malloc(sizeof(ListNode));
r=L;
for(int i=0;i<n;i++)
{
p=(ListNode*)malloc(sizeof(ListNode));
p->val=arr[i];
r->next=p;
r=p;
}
r->next=NULL;
return L->next;
}
ListNode *rotateRight(ListNode *head, int k)
{
if (head == NULL || k == 0)
return head;
int len = 1;
ListNode* p = head;
while (p->next) // 求长度
{
len++;
p = p->next;
}
k= len - k % len;
p->next = head; // 首尾相连
for(int step = 0; step < k; step++)
{
p = p->next; //接着往后跑
}
head = p->next; // 新的首节点
p->next = NULL; // 断开环
return head;
}
int main()
{
int a[]={1,2,3,4,5};
ListNode *input;
ListNode *out;
int k=2;
input= createListNode(a,5);
out=rotateRight(input, k);
while(out != NULL)
{
cout<<out->val;
out = out->next;
}
cout<<endl;
return 0;
}
测试结果: