给你一个链表的头节点
head
,旋转链表,将链表每个节点向右移动k
个位置。
解了几次要么是有的情况没考虑到,要么是力扣网给的例子都极端了,都出错了。下面说说我一开始的思路:
最开始的思路挺简单的,就是获取到链表的最后的结点,接k次接到链表表头,比如123 两次
那么就是获得链表尾,接到表头3->1->2
第二次:2->3->1
但是我用到了两个循环,不出所料 最后超出时间限制了 = =
代码如下:
//旋转链表
public static ListNode rotateRight(ListNode head, int k) {
if (head==null)return null;
if(head.next==null) return head;
while(k>0){
ListNode p = new ListNode();
ListNode q = head;
for(int i=1;i<length(q)-1;i++){
head = head.next;
}
p.val = head.next.val;// 1 2 3 4 5 51234
head.next = null;
p.next = q;
head = p;
k--;
}
return head;
}
//求链表长度
public static int length(ListNode listNode){
int length=0;
while(listNode!=null){
length++;
listNode = listNode.next;
}
return length;
}
总思路就是刚刚说的, 先新建结点q = head;循环让head指向链表倒数第二个,例子1->2->3的2,然后新建结点p,把head.next的值赋给p(也就是2),然后让3指向null,p(3)指向q(也就是最开始的表头1)即(3->1->2),head再回到新表表头进行下一个循环,直到k等于0
看了评论区发现了另一个思路
大概是说收尾相连,找到原链表第(length-k)结点,它的下一个就是新链表的头结点
//旋转链表
public static ListNode rotateRight2(ListNode head, int k) {
if(head ==null||head.next==null||k==0) return head;
ListNode q = head;
int length =0;
//指针指向链表末尾
while(head!=null){
length++;
head = head.next;
}
k %= length;
//如果k为0不需要旋转
if(k==0)return head;
//收尾相连
head.next = q;
for(int i=1;i<length-k;i++){
q = q.next;
}
ListNode p = q.next;
q.next =null;
return p;
}