题目:
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;
}
}