思路:以空间换时间,先遍历一回链表,将每个结点都存入容器中,这样不仅可以做到随机访问第K个结点,也可以轻松知道该链表长度(因K可能大于这一长度值,所以这么做也为之后K对长度取模的操作打“铺垫”)
同时要注意以下特殊情况
1.首结点为空
2.链表长度为1
3.K为0或正好等于链表长度的倍数
以上情况直接返回首结点即可
/**
* 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 || head->next==NULL || k==0)
return head;
int cnt=0;
ListNode FakeHead(0),*ptr;
vector<ListNode*> v;
FakeHead.next=head;
ptr=&FakeHead;
while(ptr)
{
ptr=ptr->next;
v.push_back(ptr);
}
cnt=v.size()-1;//ptr为空的值出被压进容器了
k=k%cnt;
if(k==0)
return head;
v[cnt-k-1]->next=NULL;
v[cnt-1]->next=v[0];
return v[cnt-k];
}
};
如果不想用额外线性级别的空间开销,可以采用之前求链表倒数第K个结点的题目,先定位好倒数第K个结点,将第K个结点做为头结点,第K-1个结点做为尾结点。其它注意事项同上,这里我就偷懒不写了。