61.旋转链表

给定一个链表,将链表向右旋转 k 个位置,其中 k 是非负数。

示例:

    给定 1->2->3->4->5->NULL 且 k = 2,
    返回 4->5->1->2->3->NULL.

这道题本身没有什么难度,特意记录在此是因为这个不着调的题目描述,明显误导。旋转链表,只需先将原链表首尾相接,变成循环链表,然后将首尾指针顺序移动即可,但这里的旋转并非字面意义的旋转,理解成将尾部 k 个元素放在头部比较合适,所以变成循环链表之后,实际的操作是移动(len-k)个,将题目的考察点放在这种文字游戏的边界条件上,这道题出的真的不怎样。

    /**
     * Definition for singly-linked list.
     * struct ListNode {
     *     int val;
     *     ListNode *next;
     *     ListNode(int x) : val(x), next(NULL) {}
     * };
     */
    class Solution {
    public:
        ListNode* rotateRight(ListNode* head, int k) {
            if (head == NULL || head->next == NULL || k == 0) return head;
            
            ListNode *h = head, *t = head;
            int len = 1;
            while (t->next) {
                t = t->next;
                ++len;
            }
            t->next = h;
            
            k = k%len;
            while (--len >= k) {
                t = t->next;
            }
            h = t->next;
            t->next = NULL;
            
            return h;
        }
    };