题目描述
给你一个链表的头节点 head ,旋转链表,将链表每个节点向右移动 k 个位置。
解题思路
- 右移k个位置,实际上就是把最后k个节点,放到链表头前面。所以,可用双指针,找到链表的倒数k+1个节点,将其next指向NULL,作为新链表结尾。将链表最后一个节点指向原链表头,最后返回倒数第k个节点的地址。
- 设链表长度为n,右移n个位置,就会得到原链表。所以当k > n时,右移k个位置,实际上是右移 k % n个位置。
解题代码
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
int list_nums(struct ListNode* head)
{
int nums = 0;
while (head != NULL)
{
nums++;
head = head->next;
}
return nums;
}
struct ListNode* rotateRight(struct ListNode* head, int k){
int nodeNums = list_nums(head);
if (nodeNums == 0)
return head;
int realK = k % nodeNums;
if (realK == 0)
return head;
struct ListNode *fast = head, *slow = head;
while (fast->next != NULL)
{
fast = fast->next;
if (--realK < 0)
{
slow = slow->next;
}
}
struct ListNode *tmp = slow->next;
slow->next = NULL;
fast->next = head;
return tmp;
}