给你一个链表的头节点 head ,旋转链表,将链表每个节点向右移动 k 个位置。
中等难度。首先得到链表的节点数量n以及尾部节点,然后计算k%n的值m,如果m为0,则表示旋转之后的链表和原来的链表是一样的,直接返回head,否则,该值可以表示当前链表的倒数第m个节点就是旋转后的头节点。
public ListNode rotateRight( ListNode head, int k ){
if( head == null || head.next == null || k == 0 ){
return head;
}
//链表总节点数
int count = 1;
ListNode tmp = head;
while( tmp.next != null ){
count++;
tmp = tmp.next;
}
k %= count;
//k为0直接返回
if( k == 0 ){
return head;
}
// 旋转
tmp.next = head;
//找到倒数第k+1个节点
for( int i = 0; i < count - k; i++ ){
tmp = tmp.next;
}
//tmp节点为旋转后链表头节点的前驱节点,
ListNode newHead = tmp.next;
//断开
tmp.next = null;
return newHead;
}