旋转链表
题目
61. 旋转链表
给你一个链表的头节点 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 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 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86
| public class RotateRight {
public static void main(String[] args) { ListNode node1 = new ListNode(1); node1.next = new ListNode(2); node1.next.next = new ListNode(3); node1.next.next.next = new ListNode(4); node1.next.next.next.next = new ListNode(5); ListNode node = rotateRight(node1, 2); System.out.println("==================="); while (node != null) { System.out.println(node.val); node = node.next; } }
public static ListNode rotateRight(ListNode head, int k) { if (head == null || head.next == null) { return head; } int n = getLength(new ListNode(0, head)) - 1; ListNode iter = head; while (iter.next != null) { iter = iter.next; } iter.next = head; for (int i = 0; i < n - k % n; i++) { iter = iter.next; } ListNode newHead = iter.next; iter.next = null; return newHead; }
public static ListNode rotateRight2(ListNode head, int k) { if (k == 0 || head == null || head.next == null) { return head; } int n = 1; ListNode iter = head; while (iter.next != null) { iter = iter.next; n++; } int add = n - k % n; if (add == n) { return head; } iter.next = head; while (add-- > 0) { iter = iter.next; } ListNode ret = iter.next; iter.next = null; return ret; }
public static int getLength(ListNode head) { int length = 0; while (head != null) { ++length; head = head.next; } return length; }
} class ListNode { int val; ListNode next;
ListNode() { }
ListNode(int val) { this.val = val; }
ListNode(int val, ListNode next) { this.val = val; this.next = next; } }
|
