【Leetcode】旋转链表

题目链接:旋转链表

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

输入: 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 > 链表长度的情况,所以先统计链表长度。得到真正需要移动的步数(k%len)。

然后我们移动到需要移动的这个节点这里,从这里断开成两个链表,然后组合。

举例:

1->2->3->4->5->NULL k = 2

向右移动2步。也就是我们需要从4这里断开。len = 5,k = 2。

但是我们为了方便链表尾节点,所以使指针p移动到3这里就应该停下。

head = p->next;   (4)

p->next = NULL;    (3)

代码:

 1 /**
 2  * Definition for singly-linked list.
 3  * struct ListNode {
 4  *     int val;
 5  *     ListNode *next;
 6  *     ListNode(int x) : val(x), next(NULL) {}
 7  * };
 8  */
 9 class Solution {
10 public:
11     ListNode* rotateRight(ListNode* head, int k) {
12
13         if(head == NULL || head->next == NULL)  return head;
14
15         ListNode* p = head;
16         ListNode* pre = NULL;
17         //统计链表长度
18         int len = 0;
19         while(p){
20             pre = p;
21             p = p->next;
22             len++;
23         }
24         k = k%len;
25         if(k == 0 ) return head;
26
27         pre->next = head;
28         p = head;
29
30         //断成两个链表
31         for(int i = 0; i < len-k-1; i++){
32             p = p->next;
33         }
34
35         //重新组合
36         head = p->next;
37         p->next = NULL;
38
39         return head;
40
41     }
42 };

原文地址:https://www.cnblogs.com/Asumi/p/12514438.html

时间: 2024-11-12 05:30:42

【Leetcode】旋转链表的相关文章

(每日算法)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

【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 旋转链表

链接: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-

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:

lintcode 170旋转链表

描述 给定一个链表,旋转链表,使得每个节点向右移动k个位置,其中k是一个非负数 样例 思路 计算链表个数len,然后先依次向右移动K个位置然后将后K%len个数字移动到前边来 /** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */ class Solution { publi

leetcode旋转数组查找 二分查找的变形

http://blog.csdn.net/pickless/article/details/9191075 Suppose a sorted array is rotated at some pivot unknown to you beforehand. (i.e., 0 1 2 4 5 6 7 might become 4 5 6 7 0 1 2). You are given a target value to search. If found in the array return it

[LeetCode系列]链表环探测问题II

给定一个链表头, 探测其是否有环, 如果没有返回NULL, 如果有返回环开始的位置. 环开始的位置定义为被两个指针指向的位置. 算法描述: 1. 快慢指针遍历, 如果到头说明无环返回NULL, 如果相遇说明有环, 进入2. 2. 慢指针回到起点, 快慢指针每次移动一格直到相遇, 返回快指针/慢指针. 代码: 1 class Solution { 2 public: 3 ListNode *detectCycle(ListNode *head) { 4 if (!head || !head->ne

旋转链表

题目描述:给定一个链表,旋转链表,使得每个节点向右移动k个位置,其中k是一个非负数 样例:给出链表1->2->3->4->5->null和k=2:返回4->5->1->2->3->null 首先,观察一下这个题目要达到的目的,其实,换一种说法,可以这样来描述:给出一个k值,将链表从倒数第k个节点处起之后的部分移动到链表前面,就样例来说,其实是将4->5这一部分移动到整个链表前面,变成4->5->1->2->3->