题目:
给定一个链表,旋转链表,将链表每个节点向右移动 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;
}
};
本文详细解析了链表旋转算法的实现,通过头尾相接和巧妙利用环的方法,有效地解决了链表节点向右移动k个位置的问题。文章提供了完整的代码实现,并对关键步骤进行了深入的说明。
1313

被折叠的 条评论
为什么被折叠?



