题目:
Given a linked list, rotate the list to the right by k places, where k is non-negative.
Example 1:
Input: 1->2->3->4->5->NULL, k = 2
Output: 4->5->1->2->3->NULL
Explanation:
rotate 1 steps to the right: 5->1->2->3->4->NULL
rotate 2 steps to the right: 4->5->1->2->3->NULL
Example 2:
Input: 0->1->2->NULL, k = 4
Output: 2->0->1->NULL
Explanation:
rotate 1 steps to the right: 2->0->1->NULL
rotate 2 steps to the right: 1->2->0->NULL
rotate 3 steps to the right: 0->1->2->NULL
rotate 4 steps to the right: 2->0->1->NULL
解答:
本题即将链表的后 k 个节点整体移至链表前端,主要是要考虑当 k>链表长度时的情况,我们令 k = len-k%len;,即可将问题转变为,将链表从前往后的第 k 个节点及其之后的链表移至链表前端。
具体思路为:
- 遍历一遍链表,得到链表的长度 len
- 此时令 node.next = head,即将链表首尾连接
- 令 k = len - k%len,此时的 k 即为链表应该断掉的位置。遍历找到 k 的前一个节点,令新的头结点 newhead 指向第 k 个节点,并让 k 的前一个节点指向 null
- 返回新头结点 newhead
class Solution {
public ListNode rotateRight(ListNode head, int k) {
if(head == null) {
return null;
}
int len = 0;
ListNode node = new ListNode(0);
node.next = head;
while(node.next!=null) {
len++;
node = node.next;
}
node.next = head;
k = len-k%len;
for(int i=0; i<k; i++) {
node = node.next;
}
ListNode newhead = node.next;
node.next = null;
return newhead;
}
}
本文详细解析了链表右旋转算法的实现原理,通过具体的示例展示了如何将链表的后k个节点移至前端,重点讨论了k大于链表长度的情况。提供了完整的代码实现,帮助读者理解并掌握这一算法。
&spm=1001.2101.3001.5002&articleId=105194331&d=1&t=3&u=3b339ca8a7ed40f2bf3cd31ce8a9fc51)
1261

被折叠的 条评论
为什么被折叠?



