1. 题目
给你一个链表的头节点 head
,旋转链表,将链表每个节点向右移动 k
个位置。
示例 1:
1 2
| 输入:head = [1,2,3,4,5], k = 2 输出:[4,5,1,2,3]
|
示例 2:
1 2
| 输入:head = [0,1,2], k = 4 输出:[2,0,1]
|
提示:
- 链表中节点的数目在范围
[0, 500]
内
-100 <= Node.val <= 100
0 <= k <= 2 * 10^9
2. 思路
- 已知题目要求旋转链表,因此需要获取链表的长度,并将
k
对链表长度进行取余,取余的目的是为了避免无效旋转
- 计算出取余后的
k
后,判断k
是否为0,如果为0则表示无需旋转,直接返回结果head
- 初始化链表头节点指针
dummy
,主要是为了有一个固定的头节点,在结果返回时,将返回dummy.next
作为结果链表的头节点,默认的dummy.next
值为当前链表的头节点
- 旋转链表需要获取三个节点的对象,如下所示,分别需要获取
rotatePreNode
,rotateStartNode
和rotateEndNode
- 获取以上三个节点后,将
rotatePreNode
的下一个节点置为空,因为该节点将在旋转后成为尾节点
- 将
rotateEndNode.next
指向dummy.next
即原始的头节点
- 将
dummy.next
节点指向rotateStartNode
,即变更新的头节点
- 返回
dummy.next
作为结果
3. 代码
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 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54
|
class Solution { public ListNode rotateRight(ListNode head, int k) { if (head == null) { return head; }
var length = len(head); k = k % length;
if (k == 0) { return head; }
var dummy = new ListNode(); dummy.next = head;
var rotatePreNode = get(dummy, length - k); var rotateStartNode = get(dummy, length - k + 1); var rotateEndNode = get(dummy, length);
rotatePreNode.next = null; rotateEndNode.next = dummy.next; dummy.next = rotateStartNode;
return dummy.next; }
private ListNode get(ListNode head, int index) { for (var i = 0; i < index; ++i) { head = head.next; } return head; }
private int len(ListNode head) { var count = 0; while (head != null) { count++; head = head.next; } return count; } }
|
4. 复杂度
Author:
zchengb
License:
Copyright (c) 2019-2024 zchengb