首页 > 技术文章 > 旋转链表

pengsay 2021-06-03 17:03 原文

问题描述

给你一个链表的头节点 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

Java代码

 1 /**
 2  * Definition for singly-linked list.
 3  * public class ListNode {
 4  *     int val;
 5  *     ListNode next;
 6  *     ListNode() {}
 7  *     ListNode(int val) { this.val = val; }
 8  *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 9  * }
10  */
11 class Solution {
12     public ListNode rotateRight(ListNode head, int k) {
13         if (head == null) {
14             return head;
15         }
16         // 当k = 0  或者只有一个元素的时候,都直接返回head即可
17         if (k == 0 || head.next == null) {
18             return head;
19         }
20 
21         // 计算出链表的长度
22         int len = 0;
23         ListNode p = head;
24         ListNode tail = null;
25         while (p != null) {
26             len++;
27             if (p.next == null) {
28                 tail = p;
29                 break;
30             }
31             p = p.next;
32         }
33 
34         if (k % len == 0) {
35             return head;
36         }
37 
38         // 变为环
39         tail.next = head;
40 
41         // 计算出移动后的尾节点(下标从0开始)
42         int x = len - k % len;
43 
44         while (x > 0) {
45             tail = tail.next;
46             x--;
47         }
48         // 找到尾节点,尾节点前面一个就是头节点
49         ListNode newHead = tail.next;
50         // 将尾节点的next设置为null
51         tail.next = null;
52         return newHead;
53     }
54 }

leetcode链接

推荐阅读