leetcode[60] Rotate List

题目:给定链表,和一个k,把链表的后k个旋转到前头,例如链表为: 1->2->3->4->5->NULL and k = 2, return 4->5->1->2->3->NULL.

一开始我想,跟将后面第k个元素删除一样,可以遍历一次就可以解决问题。但是在测评的时候发现k有大于链表长度的时候,我以为如果大于长度了就是不用翻转了,原来不是这样。如果k大于链表的长度了,那么就再从尾部开始往后一直到k为止,也就是我们可以看做在将k对链表长度取模之后的k才是一个链表从后往前的第k个。这样的话我们可以如下步骤做:

1.计算链表长度len

2.将k%=len

3.从后往前是第k个,那从前往后就是第len-k个,找到这个元素的前一个,然后再找到最后一个元素,将最后一个元素的next指向原来的head,然后将第k个元素设置为head,然后再讲第k-1个的next设置为NULL,大功告成。

/**
 * 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 || k==0) return head;
        ListNode *right = head, *left = head;
        int len = 1;
        while(right =right ->next) len++;
        k %= len;
        k = len - k;
        right = head;
        while(--k > 0) right = right->next;
        while(--len > 0) left = left->next;
        left->next = head;
        head = right->next;
        right->next = NULL;
        return head;
    }
};
原文地址:https://www.cnblogs.com/higerzhang/p/4082397.html