解题思路:
首先创建辅助节点cur遍历指向链表最后一个节点,并将cur的下一个节点指向head头节点,形成闭环,并且在遍历的过程中计算链表的长度n。
n-k表示当前节点(当前节点指向未反转节点的最后一个节点)到反转后的链表的最后一个节点的位置
为了防止k>n的情况,需要对n-k的结果对n求余
当cur前进了n-k个节点后,即cur已经走到了反转后链表的最后一个节点。
再创建一个新的节点指向反转后链表的头节点,再将cur的下一个节点指向空
代码实现:
public ListNode rotateRight(ListNode head, int k) {
if (k == 0 || head == null || head.next == null) {
return head;
}
ListNode dummy=new ListNode(0,head);
ListNode cur=dummy;
//走到链表最后一个节点
int n=0;
while(cur.next!=null){
cur=cur.next;
n++;
}
//防止n<k的情况
int m=n-k%n;
//如果反转的次数等于链表的个数
if(m==n) return head;
//形成闭环
cur.next=head;
//当前节前进m个节点
while(m>0)
{
m--;
cur=cur.next;
}
ListNode newNode=cur.next;
cur.next=null;
return newNode;
}