目录
一、题目描述
二、整体思路
三、代码
一、题目描述
原题链接
二、整体思路
首先发现这样的规律:当k大于等于链表中节点总数n时,会发现此时旋转后的链表和k=k%n时的旋转后的链表一样。同时对于特殊情况n=0和n=1时,无论k的值为多少都可以直接返回head。
因为k的所有取值情况都可以通过规律化归解决,同时旋转后的链表元素依然为原来链表中的元素且后续节点顺序与原链表相同。因此我们可以在链表尾部再接上一个和原来链表一模一样的链表,找到旋转k次之后的头结点,再从此截取原链表长度的结点作为返回值。
n-k的由来:旋转k次,代表从链表尾部往前数第k个结点为新的头结点,那么从链表头往后数就是第n-k个结点。
三、代码
/**
* 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) {
if(head==null || head.next==null) return head;
int n=1;
ListNode nxt=head;
ListNode last=head;
while(last.next!=null){
last=last.next;
n++;
}
if(k%n==0) return head;
last.next=nxt;
for(int i=0;i<n-(k%n);i++){
head=head.next;
}
ListNode ret=head;
for(int j=1;j<n;j++){
ret=ret.next;
}
ret.next=null;
return head;
}
}