一、题目:
61.旋转链表
给定一个链表,旋转链表,将链表每个节点向右移动 k 个位置,其中 k 是非负数。
示例 1:
输入: 1->2->3->4->5->NULL, k = 2 输出: 4->5->1->2->3->NULL 解释: 向右旋转 1 步: 5->1->2->3->4->NULL 向右旋转 2 步: 4->5->1->2->3->NULL
二、思路:
首先将链表首尾相连形成一个循环链表,k对链表的长度取余为几,就是把倒数第k个元素当成首元素,把循环链表断开形成新的链表。
三、代码(C++):
ListNode* rotateRight(ListNode* head, int k) {
if(!head) //链表为空
return head;
ListNode *o=head;
int size=1;
while(o->next)
{
++size; //计算链表长度
o=o->next; //o指向链表结尾
}
if(size)
k=k%size; //排除重复的k
o->next=head; //把链表首尾相连形成循环链表
for(int i=1;i!=size-k+1;i++) //把o指向新链表头结点之前
o=o->next;
ListNode *f=o->next; //把f指向新链表头结点
o->next=NULL; //断开循环链表
return f; //返回新链表
}