题目:
给定一个链表,旋转链表,将链表每个节点向右移动 k 个位置,其中 k 是非负数。
题解思路:
方法一:链表头尾相接+巧用环
1.遍历链表获得长度len。可能k会大于len,所以要进行取余处理。
2.遍历到链表末尾结点时,将链表头尾相接,串起来。在遍历到len-k%len个结点时,断开。下一个结点就是旋转链表的头结点了。
函数代码:
class Solution {
public:
ListNode* rotateRight(ListNode* head, int k) {
if(!head||k==0)
{
return head;
}
int len=0;
ListNode *cur=head;
ListNode *p=NULL;
while(cur)
{
p=cur;
cur=cur->next;
len++;
}
k=len-k%len;
//因为遍历结束时候cur已经为空,所以是空指针
//所以用p指针记录cur的前一个结点
p->next=head;
for(int i=0;i<k;i++)
{
p=p->next;
}
head=p->next;
p->next=NULL;
return head;
}
};