您的位置:首页 > 其它

leetcode 刷题之路 13 Rotate List

2014-07-26 18:33 190 查看
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;
	}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: