[数据结构]旋转链表(leetcode61)c++

旋转链表(leetcode61)c++

在这里插入图片描述
https://leetcode-cn.com/problems/rotate-list/

    //先将链表闭合成环
    //然后找到相应的位置断开这个环,确定新的链表头和链表尾
    //1. 找到旧的尾部并将其与链表头相连,整个链表闭合成环,同时计算出链表的长度 n。
    //2. 找到新的尾部,第 (n - k % n - 1) 个节点 ,新的链表头是第 (n - k % n) 个节点。
    //3. 断开环 new_tail->next = None,并返回新的链表头 new_head。
/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    ListNode* rotateRight(ListNode* head, int k) {
        //先将链表闭合成环
        //然后找到相应的位置断开这个环,确定新的链表头和链表尾
        //1. 找到旧的尾部并将其与链表头相连,整个链表闭合成环,同时计算出链表的长度 n。
        //2. 找到新的尾部,第 (n - k % n - 1) 个节点 ,新的链表头是第 (n - k % n) 个节点。
        //3. 断开环 new_tail->next = None,并返回新的链表头 new_head。

        ListNode *old_tail,*new_tail;
        ListNode *old_head,*new_head;
        int len=0;
        old_head=head;
        old_tail=head;
        if(old_tail==nullptr){
            return old_head;
        }
        len++;
        //----[1]----
        while(old_tail!=nullptr && old_tail->next!=nullptr){
            len++;
            old_tail=old_tail->next;
        }
        old_tail->next=old_head;
        //~

        //----[2]----
        int last=0; int first=0;
        new_tail=old_head;
        new_head=old_head;
        while(last!=len-k%len-1){
            if(new_tail->next!=nullptr){
                new_tail=new_tail->next;
            }
            last++;
        }

        while(first!=len-k%len){
            if(new_head->next!=nullptr){
                new_head=new_head->next;
            }
            first++;
        }
        //~

        //----[3]----
        new_tail->next=nullptr;
        return new_head;
        //~
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值