题目
给你一个链表的头节点 head
,旋转链表,将链表每个节点向右移动 k
个位置。
示例 1:
输入:head = [1,2,3,4,5], k = 2
输出:[4,5,1,2,3]
示例 2:
输入:head = [0,1,2], k = 4
输出:[2,0,1]
提示:
- 链表中节点的数目在范围
[0, 500]
内 -100 <= Node.val <= 100
0 <= k <= 2 * 109
解题思路
1.根据题目给出的示例,我们可以看出:将链表中每个节点向右移动K个位置,也就是将链表中倒数第K个节点作为头节点,其前面的所有节点放在原链表尾节点之后。
2.因此整体思路就是找到倒数第K个节点的前一个节点,然后让链表首尾相连,第K个节点作为链表旋转后的新的头节点,其前一个节点作为链表旋转后的尾节点。
3.但是由于k的值可能大于链表长度,因此我们需要先计算一下链表长度,用k对链表长度取余作为我们的新k,否则会空指针异常。
代码实现
class Solution {public ListNode rotateRight(ListNode head, int k) {if(head == null){return head;}int len = calaulate(head);k = k % len;ListNode low = head;ListNode fast = head;for(int i = 1; i <= k; i++){fast = fast.next;}while(fast.next != null){low = low.next;fast = fast.next;}fast.next = head;head = low.next;low.next = null;return head;}private int calaulate(ListNode head){int length = 1;for(ListNode cur = head; cur.next != null; cur = cur.next){length++;}return length;}
}
测试结果