本文主要是介绍leetcode 刷题之路 13 Rotate List,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
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,应该先做一个模n的操作,这样对于大于等于链表长度的k,相当于省略了一个或多个右旋n个节点的操作(右旋n个节点结果等于原链表)。通过取模操作后获得一个小于n的k,此时要做的就是获得一个链表的第倒数k的节点,具体的做法就是使用两个指针pFront,pBack,先让pFront前进k个节点,然后再使pFront和pBack同时前进,当pFront为NULL时,pBack就是第倒数k个节点。这道题为了便于后续操作,使pFront停在了倒数第一个节点,从而pBack停在了第倒数k+1个节点上,这样就很容易把后k个节点取出移动到整个链表的前面,更具体的步骤可以参考代码。
my accepted answer:
/*** 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;ListNode* pBack, *pFront;int n = 0;for (pFront = head; pFront != NULL; pFront = pFront->next)n++;if (n == 1)return head;k = k%n;pBack = head;pFront = head;for (int i = 0; i < k; i++)pFront = pFront->next;while (pFront->next != NULL){pFront = pFront->next;pBack = pBack->next;}pFront->next = head;ListNode* pRet = pBack->next;pBack->next = NULL;return pRet;}
};
这篇关于leetcode 刷题之路 13 Rotate List的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!