LeetCode 61 旋转链表

链接:https://leetcode-cn.com/problems/rotate-list

给定一个链表,旋转链表,将链表每个节点向右移动 k 个位置,其中 k 是非负数。

示例 1:

输入: 1->2->3->4->5->NULL, k = 2
输出: 4->5->1->2->3->NULL
解释:
向右旋转 1 步: 5->1->2->3->4->NULL
向右旋转 2 步: 4->5->1->2->3->NULL
示例 2:

输入: 0->1->2->NULL, k = 4
输出: 2->0->1->NULL
解释:
向右旋转 1 步: 2->0->1->NULL
向右旋转 2 步: 1->2->0->NULL
向右旋转 3 步: 0->1->2->NULL
向右旋转 4 步: 2->0->1->NULL

这道题其实就是将后k个节点放到前面来,但是有可能给的k值会大于链表长度n,所以先求模保证k一定是小于n的。然后需要两个指针分别指向倒数第一个结点和倒数第k+1个结点,方法和之前一样,先让first指针向前走k步,再让first指针和second指针同时走,直到first指针指向倒数第一个结点,此时的second指针指向倒数第k+1个结点。

然后开始移动这k个结点,将这k个结点看作一个整体进行移动,首先将first指针指向原头节点,再令头节点为second指针指向的下一个结点,最后让second指针指向空。顺序一定要对,否则会报错。

这道题虽然头节点变了,但是并没有删除等操作,所以不用设置虚拟结点。

c++代码如下:

 1 class Solution {
 2 public:
 3     ListNode* rotateRight(ListNode* head, int k) {
 4         if(!head) return NULL;
 5         int n = 0;
 6         for(auto p = head; p; p = p->next){
 7             n++;
 8         }
 9         k %= n;
10         auto first = head, second = head;
11         while(k--){
12             first = first -> next;
13         }
14         while(first->next){
15             first = first->next;
16             second = second-> next;
17         }
18         first->next = head;
19         head = second->next;
20         second->next = NULL;
21         return head;
22     }
23 };

原文地址:https://www.cnblogs.com/hellosnow/p/11562298.html

时间: 2024-11-10 14:05:13

LeetCode 61 旋转链表的相关文章

LeetCode 61——旋转链表

1. 题目 2. 解答 2.1. 方法一 将链表每个节点向右移动 1 个位置,其实就是让链表最后一个结点指向第一个结点. 因此,向右移动 k 个位置就重复上述过程 k 次即可. 然后,我们注意到,若链表有 n 个结点,则移动 n 次后就还是原链表. 原始链表 1->2->3->NULL 向右旋转 1 步: 3->1->2->NULL 向右旋转 2 步: 2->3->1->NULL 向右旋转 3 步: 1->2->3->NULL 实际上

61. 旋转链表

题目描述 给定一个链表,旋转链表,将链表每个节点向右移动 k 个位置,其中 k 是非负数. 示例 1: 输入: 1->2->3->4->5->NULL, k = 2 输出: 4->5->1->2->3->NULL 解释: 向右旋转 1 步: 5->1->2->3->4->NULL 向右旋转 2 步: 4->5->1->2->3->NULL 示例 2: 输入: 0->1->2-

【Leetcode】旋转链表

题目链接:旋转链表 题意:给定一个链表,旋转链表,将链表每个节点向右移动 k 个位置,其中 k 是非负数. 输入: 1->2->3->4->5->NULL, k = 2输出: 4->5->1->2->3->NULL解释:向右旋转 1 步: 5->1->2->3->4->NULL向右旋转 2 步: 4->5->1->2->3->NULL 题解:因为可能出现k > 链表长度的情况,所以

Leetcode: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. 解题分析: 不同于数组旋转,数组可以随机存取,数组的旋转可以巧妙的 分成两两部分递归旋转 对于链表的旋转,实际上

(每日算法)LeetCode --- Reverse Linked List II(旋转链表的指定部分)

Reverse Linked List II(旋转链表的指定部分) Leetcode Reverse a linked list from position m to n. Do it in-place and in one-pass. For example: Given 1->2->3->4->5->NULL, m = 2 and n = 4, return 1->4->3->2->5->NULL. Note: Given m, n sati

61:Rotate List(旋转链表)【链表】【两指针】

题目链接:https://leetcode.com/problems/rotate-list/ /* 题意:给出一个链表,将链表向右旋转k个位置 */ /** *思路:右旋k个位置,相当与将链表从第len-k个位置截断,然后 * 将两截链表交换位置,重新链接成一个链表 * */ struct ListNode { int val; ListNode *next; ListNode(int x) : val(x), next(NULL) {} }; class Solution { public:

【LeetCode题解】61_旋转链表(Rotate-List)

目录 描述 解法:双指针 思路 Java 实现 Python 实现 复杂度分析 描述 给定一个链表,旋转链表,将链表每个节点向右移动 k 个位置,其中 k 是非负数. 示例 1: 输入: 1->2->3->4->5->NULL, k = 2 输出: 4->5->1->2->3->NULL 解释: 向右旋转 1 步: 5->1->2->3->4->NULL 向右旋转 2 步: 4->5->1->2-&

[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. 这道旋转链表的题和之前那道Rotate Array 旋转数组 很类似,但是比那道要难一些,因为链表的值不能通过下表来访问,只能一个一个的

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个节点放到前面,可以采用快慢指针处理.不