题目分析:分析题目的要求之后,有点像先找到链表的倒数第k个结点,然后将链表首位相连在一起成环状,然后从倒数第k个结点成为新的头节点,从其前面断开。
先让q指针从head出发往后遍历k+1个结点,开始让p也从head出发和q一起同时往后挪动,当q到链表的最后一个结点的时候,p所指的结点就是倒数第k+1个结点。
/**
* 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){
return head; //如果链表为空,直接返回
}
int length = 0; //链表中的结点个数
ListNode *p= head,*q = head; //p和q为工作指针
while(q!=NULL)
{
q = q->next; //统计链表的节点个数
length++;
}
if(k==length||length==1||k%length==0) //如果k和链表长度一样,或者链表就只有一个结点,或者k是链表长度的整数倍,那么直接返回head即可。因为反转之后和之前的链表是一样的
return head;
k = k%length; //更新k
q = head; //q回到链表的开始节点
while(q->next)
{ //此while使p定位到新的链表的尾结点
if(k<=0){
p = p->next;
}
q = q->next;
k--;
}
q->next = head; //将链表首位相连
head = p->next; //从p结点后面断开,成为新的单链表
p->next = NULL;
return head;
}
};