题目: 给定一个链表,旋转链表,将链表每个节点向右移动 k 个位置,其中 k 是非负数。
输入: 1->2->3->4->5->NULL, k = 2
输出: 4->5->1->2->3->NULL
解释: 向右旋转 2 步: 4->5->1->2->3->NULL
解题思路 : 首先用len记录链表长度 , 只需要用k模上len, 就可以判断是否链表是否需要旋转, 然后将链表可以分成1->2->3 和 4->5->NULLl两部分, 最终只需要将后面的挂到前面即可: 4->5->1->2->3->NULL;
代码如下:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* rotateRight(struct ListNode* head, int k) {
struct ListNode* p1;
struct ListNode* p2;
struct ListNode* p3;
int len=1;
p1=head;
p2=head;
p3=head;
//判断如果链表为空或者链表只有一个节点,则直接返回
if(!head||!head->next)
return head;
while(p1->next)
{
len++;
p1=p1->next;
}
k=k%len;
//如果k为0
if(k==0)
return head;
//计算出链表分界点所要走的步数
len=len-k-1;
while(len--)
p2=p2->next;
//记录第二部分的头结点
p3=p2->next;
p1=p3;
//找出第二部分的尾节点
while(p1->next)
p1=p1->next;
p2->next=NULL;
p1->next=head;
return p3;
}