题目描述:
Given a list, rotate the list to the right by k places, where k is non-negative.
For example:
Given1->2->3->4->5->NULLand k =2,
return4->5->1->2->3->NULL.
题目解析:
题目的意思是:给定一个链表,将链表旋转到右边的k个位置,k是非负的。
思路:1.首先遍历一遍链表,求出链表的长度。
2.重置一下k:当k大于链表长度的时候,让k%链表长度,此时k是一个小于len的数。倒数第k个元素,就是正数的(len-k+1)个元素,从头结点走到该元素,需要走len-k步。
3.将链表的首尾相连一下,尾节点指向头结点。从尾节点开始走len-k步,就到了倒数第k个元素的前一个节点。新链表的头结点就是倒数第k个节点,并将倒数第k个节点的前一个节点置空。
AC代码:
/**
* 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 || k == 0)
return head;
ListNode* cur = head;
int len = 1;
while(cur->next)
{
len++;
cur = cur->next;
}
//此时cur指向最后一个节点
k = len - (k % len);
//首尾相连一下
cur->next = head;
for(int i = 0;i < k;++i)
{
cur = cur->next;
}
//新的头结点:
head = cur->next;
//cur指向此刻的尾,置空一下
cur->next = NULL;
return head;
}
};
(*^▽^*)