1. 程式人生 > >leetcode 隨筆 Rotate List --單鏈表的操作

leetcode 隨筆 Rotate List --單鏈表的操作

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

Example 1:

Input: 1->2->3->4->5->NULL, k = 2
Output: 4->5->1->2->3->NULL
Explanation:
rotate 1 steps to the right: 5->1->2->3->4->NULL
rotate 2 steps to the right: 4->5->1->2->3->NULL

Example 2:

Input: 0->1->2->NULL, k = 4
Output: 2->0->1->NULL
Explanation:
rotate 1 steps to the right: 2->0->1->NULL
rotate 2 steps to the right: 1->2->0->NULL
rotate 3 steps to the right: 0->1->2->NULL
rotate 4 steps to the right: 2->0->1->NULL

給了一個單鏈表,然後給出了需要反轉的步數,題意還是比較好理解的。

我的想法就是把連結串列的頭和尾連線起來,連線起來他們的相對位置其實是不發生改變的,我們只需要每次移動head的位置即可,然後找好頭之後,把尾巴的next置為nullptr

/**
 * 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 == nullptr || head->next == nullptr) return head;
		int count = 1;
		ListNode* now = head;
		while (now->next != nullptr)
		{
			count++;
			now = now->next;
		}
		k = k%count;
        if(!k) return head;
        k = count-k;
		now->next = head;
		while (k--)
		{
			head = head->next;
		}
		now = head;
		while (--count)
		{
			now = now->next;
		}
		now->next = nullptr;
		return head;
	}
};

程式碼的runtime是14ms