题目链接:https://leetcode.com/problems/rotate-list/
题目:
Given a list, rotate the list to the right by k places, where k is non-negative.
For example:
Given 1->2->3->4->5->NULL and k = 2,
return 4->5->1->2->3->NULL.
解题思路:
这题其实和求链表倒数第 k 个节点具有异曲同工之处。
找到倒数第 k 个节点的前驱,将倒数第 k 个节点及其之后的节点摘下,链接到头结点之前即可。
要注意的是,k 的大小可能大于链表的长度,这时应该先计算链表的长度,再用 k % 链表的长度,得到实际应该右移的位数。
代码实现:
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
public class Solution {
public ListNode rotateRight(ListNode head, int k) {
if(head == null || k == 0 || head.next == null)
return head;
ListNode p = head;
int len = 1;
int kTemp = k;
while(kTemp -- > 0 && p.next != null) {
p = p.next;
len ++; // 计算链表的长度
}
if(++ kTemp > 0 && p.next == null)
k %= len;
if(k == 0)
return head;
p = head;
while(k -- > 0)
p = p.next;
ListNode q = head;
while(p.next != null) {
p = p.next;
q = q.next;
}
ListNode newHead = q.next;
q.next = null;
ListNode temp = newHead;
while(temp.next != null)
temp = temp.next;
temp.next = head;
return newHead;
}
}
230 / 230 test cases passed.
Status: Accepted
Runtime: 1 ms