题目大意:给出一个链表,将其向右旋转k个节点。
算法思想:
1.如果链表为空或者K==0直接返回。
2.遍历链表,记录链表中的每个节点,并为其编号。
3.反向第K个节点将为表头结点,将尾节点和头结点连接起来。
4.如果K大于链表的长度 k%=list.size.
代码如下:
/**
* 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) {
if(head==NULL||k==0) return head;
ListNode* p=head;
map<int,ListNode*> Node;
int num=0;
while(p){
Node.insert(make_pair(++num,p));
p=p->next;
}
if(k>=Node.size()) k=k%Node.size();
if(k==0) return head;
ListNode *wzg=new ListNode(0);
wzg->next=Node[Node.size()-k+1];
if(wzg->next==head){
delete wzg;
return head;
}
Node[Node.size()]->next=Node[1];
Node[Node.size()-k]->next=NULL;
head=wzg->next;
delete wzg;
return head;
}
};