这道题通过率略低,,不知道为什么,有好几种的做法,几乎没什么难度,不过要是能在O(1)空间内就行了。
public ListNode rotateRight(ListNode head, int k) {
if (head == null) {
return head;
}
ListNode p = head;
int len = computeLength(p);
int step = k % len;
if (step == 0) {
return head;
}
int pre = len - step;
p = head;
ListNode q = combinateList(p);
ListNode result = help(q, pre, len);
return result;
}
public int computeLength(ListNode head) {
ListNode p = head;
int counter = 0;
while (p != null) {
counter++;
p = p.next;
}
return counter;
}
public ListNode combinateList(ListNode head) {
ListNode p = head;
ListNode list1 = head;
ListNode list2 = null;
ListNode q = null;
while (p.next != null) {
ListNode node = new ListNode(p.val);
if (list2 == null) {
list2 = node;
q = list2;
} else {
q.next = node;
q = q.next;
}
p = p.next;
}
q.next = new ListNode(p.val);
q.next.next = null;
p.next = list2;
System.out.println("合并后:");
printListNode(list1);
return list1;
}
public ListNode help(ListNode head, int pre, int len) {
ListNode q = head;
ListNode result = null;
ListNode p = null;
int counter = 0;
int inCounter = 0;
while (q != null) {
q = q.next;
if (result == null) {
counter++;
if (counter == pre) {
result = new ListNode(q.val);
p = result;
inCounter++;
}
} else {
inCounter++;
p.next = new ListNode(q.val);
p = p.next;
if (inCounter == len) {
q = null;
p = null;
}
}
}
return result;
}
public void printListNode(ListNode head) {
ListNode p = head;
while (p != null) {
System.out.print(p.val + "->");
p = p.next;
}
System.out.print("NULL");
}