本题源自LeetCode
-------------------------------------------
例如:给定1-> 2-> 3-> 4-> 5-> NULL和k = 2返回4-> 5 - >1-> 2->3-> NULL。
思路:
1 先遍历整个链表求出长度len,因为 k 可能大于len
2 将整个链表形成一个环,
3 然后遍历链表,走到len-k处断开链表返回即可。
代码:
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;
}
p->next=head; //形成循环链表
k=len-k%len;
for(int i=0;i<k;i++){
p=p->next;
}
head=p->next;
p->next=NULL;
return head;
}
思路2 :
1 先遍历整个链表求出长度len,因为 k 可能大于len
2 用快慢指针,快指针先走k步。在一起走
3 然后慢指针的下一个节点就是新链表的头结点。断开在组合。
if(head==NULL||k<=0)
return head;
ListNode* p=head;
int len=0;
while(p){
p=p->next;
len++;
}
k=k%len;
if(k==0)
return head;
ListNode* fast=head;
ListNode* slow=head;
while(k>0){
fast=fast->next;
k--;
}
while(fast->next){
fast=fast->next;
slow=slow->next;
}
ListNode* newHead=slow->next;
slow->next=NULL;
fast->next=head;
return newHead;
}