leetcode之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可以無限大,但k與k%n之後的旋轉效果是相同的詳見:https://oj.leetcode.com/discuss/2353/what-to-do-when-k-is-greater-than-size-of-list。理解了題意之後編碼還是比較容易實現的,首先遍歷一遍鏈表求出其長度,同時將tail指針指向最後一個節點(所以此時求長度是從1開始的)。另外可以發現,當k% n等於0時,只需返回原鏈表,否則,利用指針p和q分別指向要斷開鏈表的地方(即p指向第n - k個節點,q指向第n-k +1個節點),注意,由於第一個節點的下標爲1,所以在遍歷時要注意與數組遍歷時的不同,確保指針指向正確的位置。

class Solution {
public:
    ListNode *rotateRight(ListNode *head, int k) {
        if(head == NULL || k == 0)
			return head;
		int n = 1;
		ListNode * p = head, *q = head, *tail = head;
		while(tail->next != NULL){
		    n++;
			tail = tail->next;
		}		
		k = k % n;
		if(k == 0)
			return head;
		for(int i = 1; i < n - k; i++){
		    p = p->next;
		}
		q = p->next;
		p->next = NULL;
		tail->next = head;
		return q;
    }
};


發佈了85 篇原創文章 · 獲贊 0 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章