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

解题思路

先求出链表长度length,k对length取余得到值offset,offset是链表实际需要移动的距离。如果offset=0,则链表不用移动。此题只要得到倒数第offset-1个节点,将此节点的next节点置空,然后将原链表的最后一个节点连上原链表的头节点即可。

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
public static ListNode rotateRight(ListNode head, int k) {
// 边界处理
if (head == null || head.next == null) {
return head;
}
int length = 0;
ListNode cur = head;
// 得到链表长度
while (cur != null) {
length++;
cur = cur.next;
}
// 取余得到offset
int offset = k % length;
if (offset == 0) {
return head;
}
// 先拿到第offset+1 个节点
ListNode slow = head;
for (int i = 0; i < offset; i++) {
slow = slow.next;
}
ListNode fast = head;
// 再拿到倒数第offset-1个节点,即fast;此时slow为链表的最后一个节点
while (slow.next != null) {
slow = slow.next;
fast = fast.next;
}
ListNode newHead = fast.next;
// 将倒数第offset-1个节点的next置空,否则会出现循环链表;将最后一个节点的next置为头节点
fast.next = null;
slow.next = head;
return newHead;
}