leetcode 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
示例 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
解法1:哈希法
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
#define MAX 1000
struct ListNode* rotateRight(struct ListNode* head, int k){
if (head == NULL) {
return head;
}
struct ListNode *map[MAX] = {NULL};
int len = 0;
while (head) {
map[len++] = head; //求得长度
head =head->next;
}
k = k % len; //大于len的少执行
if ( k == 0) {
head = map[0];
} else {
(map[len-1])->next = map[0]; //尾->首
(map[len-k-1])->next = NULL; //要移动的前继节点断开
head = map[len-k]; //返回节点
}
return head;
}
解法2: 循环链表旋转
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* rotateRight(struct ListNode* head, int k){
if (head == NULL) {
return head;
}
struct ListNode* before = NULL, *p = head;
int len = 0;
//求得长度 与 tail 节点
while(p) {
len++;
if (p->next == NULL) {
before = p;
}
p = p->next;
}
k = len - k % len; //求还需移动的次数
before->next = head; //尾节点 变 头节点的前继
while(k--) { //移动N次
before = head;
head = head->next;
}
before->next = NULL; //前继节点断开,返回head
return head;
}