LeetCode --- 61. Rotate List

题目链接: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步。

其实就是把链表后面l-k个节点放到前面,可以采用快慢指针处理。不过当k大于链表长度l的时候,就会出现问题。这时需要做一点点处理,就是当快指针f指向最后节点后,下一次令其指向头节点,这样问题就解决了。这样的时间复杂度是O(k),因此,当k非常大的时候,会TLE。

考虑到k大于l的时候,可以令k对l取模处理。因此,先计算链表长度,同是令p指向链表最后节点。接下来k对l取模,再令q从头节点往后移动l-k步,这样q就指向要旋转的位置。最后将q后面的节点放到前面即可。

假设k=2,加头之后链表为:
h -> 0 -> 1 -> 2 -> 3 -> 4 -> 5 -> NULL。

领p指向链表最后节点,q指向要旋转的位置,即:
h -> 0 -> 1 -> 2 -> 3 -> 4 -> 5 -> NULL
                    ^         ^
                    |         |
                    q         p

接下来把q后面的节点放到前面:
h -> 0 -> 4 -> 5 -> 1 -> 2 -> 3 -> NULL
               ^              ^
               |              |
               p              q

处理的时候,同样先对链表加头,方便处理,类似于Remove
Nth Node From End of List
Swap Nodes in PairsReverse
Nodes in k-Group
,同样先对链表加头处理。

时间复杂度:O(l)(l是链表长度)

空间复杂度:O(1)

 1 class Solution
 2 {
 3 public:
 4     ListNode *rotateRight(ListNode *head, int k)
 5     {
 6         if(head == NULL)
 7             return NULL;
 8
 9         // 链表加头,方便处理
10         ListNode *h = new ListNode(0), *p, *q;
11         h -> next = head;
12
13         int l = 0;
14         // p指向最后节点
15         for(p = h; p -> next != NULL; ++ l, p = p -> next);
16         // q指向要要旋转位置,即旋转后最后节点
17         for(q = h, k = l - k % l; k > 0; -- k, q = q -> next);
18
19         // 把链表后半段放到前面
20         p -> next = h -> next;
21         h ->next = q -> next;
22         q -> next = NULL;
23
24         return h -> next;
25     }
26 };

转载请说明出处:LeetCode --- 61. Rotate List

时间: 2024-12-16 20:06:41

LeetCode --- 61. Rotate List的相关文章

[LeetCode] 61. 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-&g

leetcode 61 Rotate List ----- java

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大于链表长度len

[LeetCode] 61. 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 个元素至列表最前面. 关键是找到最后元素 lastOne 和 旋转后列表新的最后元素

leetCode 61.Rotate List (旋转链表) 解题思路和方法

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. 思路:题目很清晰,思路是先得到链表长度,再从头开始直到特定点,开始变换连接即可. 代码如下: /** * D

19.2.9 [LeetCode 61] 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-&g

[leetcode]61. Rotate List反转链表k个节点

类似于找链表的后k个节点 不同的是要把前边的接到后边 public ListNode rotateRight(ListNode head, int k) { //特殊情况 if (head==null||head.next==null||k==0) return head; int len = 0; ListNode p = head; //计算链表长度,防止k大于长度 while (p!=null) { len++; p = p.next; } //k大于等于len的情况 k = k>=len

LeetCode OJ 61. Rotate List 考虑边界条件

题目链接:https://leetcode.com/problems/rotate-list/ 61. Rotate List My Submissions QuestionEditorial Solution Total Accepted: 71917 Total Submissions: 311425 Difficulty: Medium Given a list, rotate the list to the right by k places, where k is non-negati

【Leetcode】Rotate Image

You are given an n x n 2D matrix representing an image. Rotate the image by 90 degrees (clockwise). Follow up: Could you do this in-place? 思路:第一种思路是一层一层的进行旋转,比较直观:第二种思路则比较取巧,首先沿着副对角线翻转一次,然后沿着水平中线翻转一次. 代码一: class Solution { public: void rotate(vector<

61. Rotate List(M);19. Remove Nth Node From End of List(M)

61. Rotate List(M) 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. Total Accepted: 102574 Total Submissions: 42333