LeetCode 61. Rotate List

来源:互联网 发布:js encode 编辑:程序博客网 时间:2024/06/06 11:40

题目:
Given a list, rotate the list to the right by k places, where k is non-negative.

For example:
Given 1->2->3->4->5->NULL and k = 2,
return 4->5->1->2->3->NULL

思路:
将链表右移k次,要注意的就是k如果很大,只要先将k对链表长度len取余,减小时间复杂度。
如果head为NULL,直接返回NULL。记len初始为1,设置双指针pre、end,都初始化为head。借用end来计算len,如果end的next不为NULL ,len加1,end指向下一个。如果k比链表的长度大,则取余,end再赋值为head,使得pre和end包含k+1个节点。如果end的下一个如果不是NULL,pre和end都后移。最后将end的next接到原来的head,因为pre和end包含k+1个节点,新的head就为pre的下一个节点,pre的下一个此时就是链表尾部,为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){//如果head为NULL,直接返回NULL            return NULL;        }        int len=1;//记len为1        ListNode *pre=head;//设置双指针        ListNode *end=head;        while(end->next){//借用end来计算len,如果endnext不为NULL             ++len;//len加1            end=end->next;//end指向下一个        }        k%=len;//如果k比链表的长度大,则取余        end=head;//end再赋值为head        while(k){//使得pre和end包含k+1个节点            end=end->next;            --k;        }        while(end->next!=NULL){//end的下一个如果不是NULL            pre=pre->next;//pre和end都后移            end=end->next;        }        end->next=head;//将endnext接到原来的head        head=pre->next;//因为pre和end包含k+1个节点,新的head就为pre的下一个节点        pre->next=NULL;//pre的下一个此时就是链表尾部,为NULL        return head;    }};

**输出结果:**12ms

0 0
原创粉丝点击