LinkList4

题目描述[原题链接][https://leetcode-cn.com/problems/rotate-list/]

给定一个链表,旋转链表,将链表每个节点向右移动 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

算法描述

​ 要求将链表中的每一个节点向右移k个位置,可以优化为,先找到链表尾的位置,将尾部和头部连起来成为一个环,将移动的k位对链表长度取模,找到最后链表的头部,把环断开,返回新的链表就可以了;

C++代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
class Solution {
public:
ListNode* rotateRight(ListNode* head, int k) {
if(head==NULL)return head;
if(head->next==NULL)return head;
int len=1;
ListNode *l=NULL;
l=head;
while(l->next){
len++;
l=l->next;
}
k=k%len;
l->next=head;
l=head;
for(int i=0;i<len-k-1;i++)
l=l->next;
head=l->next;
l->next=NULL;
return head;
}
};

Java代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class Solution {
public ListNode rotateRight(ListNode head, int k) {
if(head==null||head.next==null)return head;
int len = 1;
ListNode l = head;
while(l.next!=null){
len++;
l=l.next;
}
k=k%len;
l.next=head;
l=head;
for(int i=0;i<len-k-1;i++)l=l.next;
head = l.next;
l.next = null;
return head;
}
}