首页 > 其他分享 >力扣-旋转链表

力扣-旋转链表

时间:2023-07-12 20:34:04浏览次数:39  
标签:力扣 head ListNode 结点 旋转 链表 next NULL

1.问题描述

给定一个链表,旋转链表,将链表每个节点向右移动 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

2.输入说明

3.输出说明

4.范例

输入:

输出:

5.思路

代码中创建的链表是无头结点单链表,其中k为旋转的步数,返回旋转后的链表头指针。

使用c++STL的map对原链表进行映射,并使用vector函数构造新的链表。

设置 n为链表的长度,即链表的结点数,i为map映射的标记,设置为0。其中需要先将链表设置为循环链表,当k=0时,选择vector[n-k%n]作为第一个结点,依次显示,显示到最后一个结点时,再将next设置为NULL,即可成为一个旋转后的单链表。

6.代码

#include<iostream>
#include<stdio.h>
#include<math.h>
#include<map>
#include<vector>
using namespace std;

struct ListNode
{
  int val;
  ListNode *next;
  ListNode() : val(0), next(NULL) {}
  ListNode(int x) : val(x), next(NULL) {}
  ListNode(int x, ListNode *next) : val(x), next(next) {}
};
class Solution {
public:
  ListNode* rotateRight(ListNode* head, int k)
  {
    std::vector<ListNode *>node_vec;
    std::map<ListNode *,int>node_map;
    int i=0;
    ListNode *p=head;
    if(p==NULL||k==0)
      return head;
    while(p)
    {
      node_vec.push_back(new ListNode(p->val));//首先将创建的vector新链表
      node_map[p]=i;//对原链表进行映射
      p=p->next;
      i++;
    }
    int n=i;
    i=0;
    while(i<n-1)
    {
      node_vec[i]->next=node_vec[i+1]; //对vector创建的新链表进行按原顺序连接
      i++;
    }
    node_vec[i]->next=node_vec[0]; //将最后一个结点的next设置为第一个结点,形成一个循环链表
    n=n-k%n;//根据旋转k的步数推算出第一个结点的映射规律
    if(n==i+1)
    {
      return head;//当n等于自己时,旋转的k个步长和原链表一样,因此不需要进行修改
    }
    head=node_vec[n];  //将第n=n-k%n个结点赋值给head
    node_vec[n-1]->next=NULL;//第n个结点设置为头结点,为了把循环链表变为单链表,需要将第n-1个结点设置为空,即可设置为单链表
    return head;
  }

};
ListNode *createByTail()
{
  ListNode *head;
  ListNode *p1,*p2;
  int n=0,num;
  int len;
  cin>>len;
  head=NULL;
  while(n<len && cin>>num)
  {
    p1=new ListNode(num);
    n=n+1;
    if(n==1)
      head=p1;
    else
      p2->next=p1;
    p2=p1;
  }
  return head;
}
void displayLink(ListNode *head)
{
  ListNode *p;
  p=head;
  cout<<"head-->";
  while(p!= NULL)
  {
    cout<<p->val<<"-->";
    p=p->next;
  }
  cout<<"tail\n";
}
int main()
{
//freopen("in.txt","r",stdin);
//freopen("out.txt","w",stdout);
  int k;
  ListNode* head = createByTail();
  cin>>k;
  head=Solution().rotateRight(head,k);
  displayLink(head);
  return 0;
}

标签:力扣,head,ListNode,结点,旋转,链表,next,NULL
From: https://www.cnblogs.com/ohye/p/17548757.html

相关文章

  • 双链表实现
    题目实现一个双链表,双链表初始为空,支持$5$种操作:在最左侧插入一个数;在最右侧插入一个数;将第$k$个插入的数删除;在第$k$个插入的数左侧插入一个数;在第$k$个插入的数右侧插入一个数现在要对该链表进行$M$次操作,进行完所有操作后,从左到右输出整个链表。注意:题目中......
  • python实现两函数通过缩放,平移和旋转进行完美拟合
    Curve_fitting前几天在工作的时候接到了一个需求,希望将不同坐标系,不同角度的两条不规则曲线,并且组成该曲线的点集数量不一致,需求是希望那个可以通过算法的平移和旋转搞到一个概念里最贴合,拟合态进行比较。这是初步将两组数据画到图里的情况,和背景需求是一致的。其实从肉眼看过......
  • LeetCode 剑指 Offer 11. 旋转数组的最小数字
    题目链接:LeetCode剑指Offer11.旋转数组的最小数字题意:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。给你一个可能存在 重复 元素值的数组 numbers ,它原来是一个升序排列的数组,并按上述情形进行了一次旋转。请返回旋转数组的最小元素。例如,数组 [......
  • LeetCode 234. 回文链表
    classSolution{public:ListNode*reverse(ListNode*head)//翻转以head为头节点的链表{if(!head||!head->next)returnhead;autoa=head,b=head->next;while(b){autoc=b->next;b->next=a;......
  • Redis 数据结构 - 链表
    链表-List的底层实现链表提供了高效的节点重排能力,可以通过顺序访问的方式访问节点,并且支持增加删除节点调整长度。由于C语言原生并不支持链表,redis的链表是自己实现的。List的底层实现就是一个双向链表,支持从链表的两端进行push和pop操作,时间复杂度是O(1)。同时支持在......
  • 反转链表
    给定一个单链表的头结点pHead(该头节点是有值的,比如在下图,它的val是1),长度为n,反转该链表后,返回新链表的表头。 如当输入链表{1,2,3}时,经反转后,原链表变为{3,2,1},所以对应的输出为{3,2,1}。以上转换过程如下图所示:......
  • 力扣---1911. 最大子序列交替和
    一个下标从 0 开始的数组的 交替和 定义为 偶数 下标处元素之 和 减去 奇数 下标处元素之 和 。比方说,数组 [4,2,5,3] 的交替和为 (4+5)-(2+3)=4 。给你一个数组 nums ,请你返回 nums 中任意子序列的 最大交替和 (子序列的下标 重新 从0开始......
  • 矩阵旋转
    矩阵旋转题目:使用C++,原地90℃旋转一个M*N的矩阵,不允许增加任何内存空间(空间复杂度为O(1))分析:1、使用一个函数rotateMatrix,这个函数通过对矩阵进行转置和中心对称交换,实现了将矩阵顺时针旋转90度。123->147->741456->258->8......
  • leetcode328奇偶链表
    思路:先将寄链表连接起来;再将偶链表连接起来;最后将寄链表和偶链表一起连起来。首先需要一个指针结构体去记录下偶链表的表头。最后才能将两个链表连接起来。 ListNode*odd=head;LisrNode*even=head->next;ListNode*evenhead=head->next;//必须这么做,每个链表表头必须用另......
  • ABC_DQ:基于MATLAB/Simulink的三相静止坐标系到两相静止坐标系(Clark变换)到两相旋转坐标
    ABC_DQ:基于MATLAB/Simulink的三相静止坐标系到两相静止坐标系(Clark变换)到两相旋转坐标系变换(Park变换)的仿真模型。仿真条件:MATLAB/SimulinkR2015bID:2720651503371560......