Nameless Site

But one day, you will stand before its decrepit gate,without really knowing why.

0%

旋转链表

来源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

双指针

不管移动多少步,如果先将链表连接成环,那么最后移动的步数就是 k%n 了,其中n是总的节点数。
这样的话新的头结点是在第n - k % n 个结点,而新的尾结点自然是在n - k % n - 1 个结点了,最后只需要将尾结点的next修改为null即可。

代码如下:

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
 class ListNode {
int val;
ListNode next;

ListNode(int x) {
val = x;
}

public ListNode rotateRight(ListNode head, int k) {
if (head == null) return null;
if (head.next == null) return head;
int n = 1;
ListNode preHead = head;
ListNode newTail = head;
//计算链表长度
while (preHead.next != null) {
n++;
preHead = preHead.next;
}
//将链表闭合成环
preHead.next = head;
//找到新的尾结点
for (int i = 0; i < n - k % n - 1; i++)
newTail = newTail.next;
//新的头结点就是新的尾结点的next
ListNode newHead = head;
newHead = newTail.next;
//修改新的尾结点的next
newTail.next = null;
return newHead;
}

}