【算法】【线性表】【链表】旋转链表
1 题目
给你一个链表的头节点 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 * 10^9
2 解答
先对 k 降级,然后找断点,然后拼接两个链表即可:
/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode() {} * ListNode(int val) { this.val = val; } * ListNode(int val, ListNode next) { this.val = val; this.next = next; } * } */ class Solution { public ListNode rotateRight(ListNode head, int k) { // 参数边界校验 if (head == null || head.next == null || k <= 0) { return head; } // 计算节点的数量 int sum = 0; ListNode node = head; while (node != null) { sum ++; node = node.next; } // 对 k 进行降级 // 比如 长度为5 k=7,那么其实就是和k=2的效果一样的 k = k % sum; // 如果降级后为0,直接返回吧 if (k == 0) { return head; } // 这道题其实就是把链表变成了两段 // 比如sum 长度 = 5 // k = 2 // 其实就是把第3(5-2)个后边的元素都移到前边 // 还是照常我喜欢加一个头节点 ListNode preNode = new ListNode(0); preNode.next = head; node = preNode; // 计数器 计算遍历到第几个节点了,然后当count == target时,就把后边的元素放到前边 // 这个后边的移到前边就是断点后的最后一个元素的next 指向preNode.next即可。 int target = sum - k; int count = -1; while (node != null) { count ++; // 到达第 k 个元素 到达断点 if (count == target) { break; } node = node.next; } ListNode markNode = node, markNextNode = node.next; // 遍历到尾部 while (node.next !=null) { node = node.next; } // 尾部的next 指向preNode.next 首位连接 node.next = preNode.next; // 然后把断点的元素的next 设置为空 markNode.next = null; // 然后返回断点的起始元素 return markNextNode; } }
加油。