分析
题目中说的是旋转,但其实本质上是将尾部向前数第K个元素作为头,原来的头接到原来的尾上我们可以用快慢指针来解决这个问题。
- cur当前节点(用于遍历链表,得到链表的长度)
- k代表链表的长度
- newHead旋转后链表的头部
- fast(快指针)
- slow(慢指针)
具体思路
- 我们先计算链表的长度,用k=k%count得出新的k值(效果是一次样的,避免多走)
- 然后让fast走k步,然后fast和slow一起走
- 当fast.next=null时停下,此时slow.next是旋转后链表的头(slow.next=newHead),再将head连接到fast后面即可(fast.next=head),再将slow.next置为null即可
下面结合图来理解一下
开始
fast走K步
fast和slow一起走,当fast.next==null时slow的位置
变为新的连接关系
代码如下:
class Solution {
public ListNode rotateRight(ListNode head, int k) {
if(head==null||head.next==null||k==0)
{
return head;
}
ListNode cur = head;
int count = 0;
while(cur!=null){
cur = cur.next;
count++;
}
k = k % count;
if(k==0)
{
return head;
}
ListNode fast = head;
ListNode slow = head;
while(k!=0)
{
fast=fast.next;
k--;
}
while(fast.next != null){
fast = fast.next;
slow = slow.next;
}
ListNode newHead = slow.next;
slow.next = null;
fast.next = head;
return newHead;
}
}