🥇问题描述:
🥇问题解析:
此题为旋转链表,其实这个题就是要把相关的链表节点,向后移动几位,如果后半段的链表节点在链表中移动位数不够的话,就移动节点到前半个链表。那么我们都知道单链表只能从头节点一直遍历到单向遍历到链表的尾节点,那么对于这个题来说,如果要旋转尾节点,那么尾节点自然要旋转到链表的其他节点,根据这样的思路我们不难想到如果连接链表的头节点和为节点,这样本题不就轻松的解决了吗
🥇 思路:
我们现在已知链表的头节点,和要旋转的节点位数。
- 那我们想想如果链表为空,是不是就不用旋转,直接就返回这个空节点。
- 如果链表中只有一个节点,是不是无论旋转结尾都和没旋转一样。
- 如果要移动的节点个数为链表个数的倍数,也等于没有旋转。
- 现在我们把
链表的头节点和尾节点连接起来
,在遍历这个循环链表的过程中找到新链表的尾节点
,先保存链表尾节点的下一个节点(也就是新链表的头节点)然后从新链表的尾节点之后断开循环链表
,这样就变成了旋转之后的链表。
🥇 看图说话:
💯相关代码:
public Node rotateRight(int k) {
//判断链表是否为空,如果链表为空,或者链表中只有一个节点
if(k== 0 || head == null || head.next == null){
return head;
}
//遍历链表,求出链表的长度,判断旋转位数是不是链表长度的倍数
int count = 1;
Node cur = head;
while(cur.next != null){
count++;
cur = cur.next;
}
int add = count - k % count;
//如果旋转链表节点的个数是链表长度的倍数,那么就等于没有旋转链表,接直接返回原链表的头节点
if(add == count){
return head;
}
//连接链表中的头节点和尾节点
cur.next = head;
//找到新链表的尾节点,断开尾节点之后的链表
while(add-- > 0){
cur = cur.next;
}
Node temp = cur.next;
cur.next = null;
return temp;
}