解题思路:
本题的解题思路并不难,很容易的就能想到是拼接链表
即将后半段拼接到前半段即可
然而难点在于如何简化代码
正常思路: 从开头往后数k+1个,当前节点为尾节点,后一个节点为新头节点,再将尾节点的next设为null.从新头节点开始遍历len - (k % len)后拼接
需要两步
然而正常思路有个严重的问题:操作繁琐且容易出错
因此可以使用环形链表来简化流程
即直接将最后一个节点的next设置为头节点形成环形链表
此时由于形成闭环,我们可以直接在需要断点的地方断掉
仅需一步
如图
最终代码
class Solution {
public ListNode rotateRight(ListNode head, int k) {
if(head == null || head.next == null || k == 0)
{
return head;
}
ListNode tempHeadh = head;
int len = 1;
while(tempHeadh.next != null)
{
tempHeadh = tempHeadh.next;
len++;
}
if(k % len == 0)
{
return head;
}
int lenL = len - (k % len);
tempHeadh.next = head;
while(lenL-->0)
{
tempHeadh = tempHeadh.next;
}
ListNode start = tempHeadh.next;
tempHeadh.next = null;
return start;
}
}