给定一个链表,旋转链表,将链表每个节点向右移动 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
示例 2:
输入: 0->1->2->NULL, k = 4
输出: 2->0->1->NULL
解释:
向右旋转 1 步: 2->0->1->NULL
向右旋转 2 步: 1->2->0->NULL
向右旋转 3 步: 0->1->2->NULL
向右旋转 4 步: 2->0->1->NULL
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/rotate-list
【解题思路】
1、先把原链表链成一个环形链表,将其表尾指向表头;
2、找到旋转的起点作为新链表的表头;
【提交代码】
1 /** 2 * Definition for singly-linked list. 3 * struct ListNode { 4 * int val; 5 * struct ListNode *next; 6 * }; 7 */ 8 9 struct ListNode* rotateRight(struct ListNode* head, int k) 10 { 11 int i; 12 int n; 13 int offset; 14 struct ListNode *p; 15 16 if( head == NULL || head->next == NULL ) 17 return head; 18 19 p = head; 20 n = 1; 21 // p移到链表的尾巴,并且获取到链表的长度len 22 while( p->next != NULL ) 23 { 24 p = p->next; 25 n++; 26 } 27 //printf("link list len: %d ", n); 28 29 // 链表的尾巴指向head,形成一个环 30 p->next = head; 31 32 // 找到旋转的起点,需要从head开始移动多少步 33 offset = n - ( k % n ) - 1; 34 //printf("offset: %d ", offset); 35 36 p = head; 37 // p移动到新链表头的前一个节点 38 for( i = 0; i < offset; i++ ) 39 { 40 p = p->next; 41 } 42 // 新链表的表头 43 head = p->next; 44 45 p->next = NULL; 46 47 return head; 48 }