栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

Leetcode题库61. 旋转链表(c实现)

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Leetcode题库61. 旋转链表(c实现)

文章目录
  • 思路
  • 举例
  • 代码
    • 方法1
    • 方法2(省去方法1中的ret,直接返回head)

思路

1、计算链表总长度,并把链表变为循环链表

2、计算旋转后链表头节点的前一个节点,将p移至此处

3、将p->next保存ret=p->next,再将p->next=null,断开循环链表,返回ret

举例

输入:head = [1,2,3,4,5], k = 2
输出:[4,5,1,2,3]
1、链表长度为num_node=5,链表变为循环链表,p指向5(原链表的尾部)

2、计算旋转后链表头节点的前一个节点的位置
num_node - k%num_node=5-2=3,旋转后链表头节点的前一个节点的位置是在第3个节点,将p移至此处

3、使得ret指向p->next,ret就指向val=4的节点,断开循环链表p->next=null,返回ret

关键:
只要理解了第2步计算的意义,此题也就迎刃而解了

代码 方法1
struct ListNode* rotateRight(struct ListNode* head, int k){
    if(head==NULL) return NULL;
    struct ListNode *p=head,*ret;
    //计算链表长度
    int num_node=1;
    while(p->next!=NULL){
        p=p->next;
        num_node++;
    }
    //head变为循环链表
    p->next=head;

	//计算移位后头节点的前一个节点
    num_node=num_node-k%num_node;
    while(num_node>0){
        p=p->next;
        num_node--;
    }
	
	//将移位后的头节点赋予ret,p->next=NULL断开循环链表
    ret=p->next;
    p->next=NULL;
    return ret;
}
方法2(省去方法1中的ret,直接返回head)
struct ListNode* rotateRight(struct ListNode* head, int k){
    if(head==NULL) return NULL;
    struct ListNode *p=head;
    //计算链表长度
    int num_node=1;
    while(p->next!=NULL){
        p=p->next;
        num_node++;
    }
    //head变为循环链表
    p->next=head;

	//计算移位后头节点的前一个节点
    num_node=num_node-k%num_node;
    while(num_node>0){
        p=p->next;
        num_node--;
    }
	
	//将移位后的头节点赋予head,p->next=NULL断开循环链表
    head=p->next;
    p->next=NULL;
    return head;
}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/835594.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号