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
.
链表的题目一定要小心,非常容易出错。
java
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public ListNode rotateRight(ListNode head, int k) {
if (head == null || k == 0) {
return head;
}
int num = Length(head);
if (num == 1 || k % num == 0) {
return head;
}
k = k % num;
ListNode dummy = new ListNode(-1);
dummy.next = head;
head = dummy;
for (int i = 0; i < num - k; i++) {
head = head.next;
}
ListNode left = head.next;
ListNode curr = left;
head.next = null;
while (curr.next != null) {
curr = curr.next;
}
curr.next = dummy.next;
return left;
}
private int Length(ListNode head) {
int num = 0;
while (head != null) {
head = head.next;
num++;
}
return num;
}
}
python
# Definition for singly-linked list.
# class ListNode(object):
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution(object):
def rotateRight(self, head, k):
"""
:type head: ListNode
:type k: int
:rtype: ListNode
"""
if head is None or k == 0:
return head
num = self.findLength(head)
if num == 1 or k % num == 0:
return head
else:
k = k % num
dummy = ListNode(-1)
dummy.next = head
head = dummy
for i in range(num - k):
head = head.next
left = head.next
curr = left
head.next = None
while curr.next is not None:
curr = curr.next
curr.next = dummy.next
return left
def findLength(self, head):
num = 0
while head is not None:
head = head.next
num += 1
return num