leetcode:旋转链表

leetcode:旋转链表
解题思路
先遍历求出链表的长度,再通过(k%len)找到新的尾节点,形成环形链表,保存新链表的头结点,最后再断开环形链表。

class Solution {
public:
    ListNode* rotateRight(ListNode* head, int k) {
      
        if(!head)   return 0;
        //指针p来计算链表的长度,指针p1是来得到新链表的尾节点,指针p2来形成环形链表
        ListNode* p1 = head,* p2 = head, *p = head;
        int len = 0;
        while(p){
            len++;
            p=p->next;
        }
        k %= len;
        //p2先移动k个单位,然后再带p1移动L-k-1个单位找到新链表的尾节点
        while(k--){
            p2 = p2->next;
        }
        //p1移动L-k-1个单位得到新链表的尾节点
        while(p2->next){//p1移动L-k-1个单位到达新链表的尾节点
            p1 = p1->next;
            p2 = p2->next;
        }
        p2->next = head;//形成环形链表
        ListNode* ans = p1->next;//p1的next节点作为新链表的头结点
        p1->next = NULL;//断开环形链表
        return ans;//返回头结点
    }
};