61. Rotate List

来源:互联网 发布:如何用c语言编写小程序 编辑:程序博客网 时间:2024/06/05 20:11

这道题是翻转链表,就是倒着数k个node,从那开始到结尾和之前那部分对调。

快慢指针。解决这种链表,要倒着数的问题。

快指针先走k步,然后两个指针一起走,当快指针走到末尾时,慢指针的下一个位置是新的顺序的头结点,这样就可以旋转链表了。但是这道题注意两个细节,一个是head有可能是空,直接返回空。还有k有可能是大于n的,所以要先遍历链表,得到链表长度,然后如果k大于n,那么取k等于k % n,注意不要写反了。

/** * 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)    return NULL;        int n = 0;        ListNode *node = head;        while(node){            n++;            node = node->next;        }        if(k >= n)  k = k % n;        ListNode* slow = head, *fast = head;        for(int i = 0; i < k; ++i){            fast = fast->next;        }        if(fast == NULL)    return head;        while(fast->next){            fast = fast->next;            slow = slow->next;        }        fast->next = head;        fast = slow->next;        slow->next = NULL;        return fast;    }};