题目及测试
package pid061;
/*61. 旋转链表
给你一个链表的头节点 head ,旋转链表,将链表每个节点向右移动 k 个位置。
示例 1:
输入:head = [1,2,3,4,5], k = 2
输出:[4,5,1,2,3]
示例 2:
输入:head = [0,1,2], k = 4
输出:[2,0,1]
提示:
链表中节点的数目在范围 [0, 500] 内
-100 <= Node.val <= 100
0 <= k <= 2 * 109
*/
public class main {
public static void main(String[] args) {
LinkList a=new LinkList(1);
a.addLast(2);
a.addLast(3);
a.addLast(4);
a.addLast(5);
LinkList b=new LinkList(0);
b.addLast(1);
b.addLast(2);
test(a.first,2);
test(b.first,4);
}
private static void test(ListNode ito,int ito2) {
Solution solution = new Solution();
ListNode rtn;
long begin = System.currentTimeMillis();
System.out.println();
//开始时打印数组
ito.printNodeToEnd();
System.out.println("ito2="+ito2);
rtn=solution.rotateRight(ito,ito2);//执行程序
rtn.printNodeToEnd();
long end = System.currentTimeMillis();
//System.out.println(":rtn" );
//System.out.print(rtn);
System.out.println();
System.out.println("耗时:" + (end - begin) + "ms");
System.out.println("-------------------");
}
}
解法1(成功,0ms,极快)
先获取链表的长度,然后从头部移动length-k-1次,得到head,leftTail,rightHead,
然后再向后移动到null,得到rightTail。然后rigthtail.next指向head,leftTail.next指向null即可
package pid061;
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode() {}
* ListNode(int val) { this.val = val; }
* ListNode(int val, ListNode next) { this.val = val; this.next = next; }
* }
*/
class Solution {
public ListNode rotateRight(ListNode head, int k) {
int length = 0;
ListNode now = head;
if(head==null||k<=0){
return head;
}
while(now!=null){
now = now.next;
length++;
}
k=k%length;
if(k==0){
return head;
}
ListNode leftTail = head;
ListNode rightHead = head.next;
ListNode rightTail = null;
for(int i=0;i<length-k-1;i++){
leftTail=leftTail.next;
rightHead=leftTail.next;
}
rightTail=rightHead;
while(rightTail.next!=null){
rightTail=rightTail.next;
}
leftTail.next=null;
rightTail.next=head;
return rightHead;
}
}