LeetCode OJ 之 Rotate List (链表旋转)

来源:互联网 发布:广州做网络推广的公司 编辑:程序博客网 时间:2024/05/16 12:32

题目:

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.


思路:

先遍历一遍,得出链表长度l en,注意k 可能大于l en,因此令k% = l en。将尾节点next 指针指向首节点,形成一个环,接着往后跑l en − k 步,从这里断开,就是要求的结果了。

代码1:

/** * 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 *p1 = head ;        int len = 1;        while(p1->next)        {            len++;            p1 = p1->next;        }        k = len - k % len;        p1->next = head;        for(int i = 0 ; i < k ; i++)        {            p1 = p1->next;//注意这里是从p1开始向后,需要向后挪动k次,如果从头向后,只需要向后挪动k-1次即可        }        head = p1->next;        p1->next = NULL;        return head;    }};

代码2:

/** * 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 *p1 = head , *p2 = head ;        int len = 1;        while(p1->next)        {            len++;            p1 = p1->next;        }        k = len - k % len;        for(int i = 0 ; i < k - 1 ; i++)        {            p2 = p2->next;        }        p1->next = head;        head = p2->next;        p2->next = NULL;        return head;    }};



0 0
原创粉丝点击