• Leetcode61.旋转链表


    
    

    链表中的点已经相连,一次旋转操作意味着:

    
    
    • 先将链表闭合成环
    • 找到相应的位置断开这个环,确定新的链表头和链表尾
    
    
    


    class
    Solution{ public: ListNode* rotateRight(ListNode* head,int k) { //判断是否为空或者是不是只有一个结点 if(head==NULL || head->next==NULL) return head; ListNode* oldTail=head; int n;//链表长度啊 for(n=1;oldTail!=NULL;n++) oldTail=oldTail->next; oldTail->next=head; //寻找新的头结点啦 ListNode* new_tail=head; k=k%n;//防止循环性移动哈 for(int i=0;i<n-k-1;i++) new_tail=new_tail->next; ListNode* newHead=new_tail->next; new_tail->next=NULL; return head; } };

    复杂度分析

    • 时间复杂度:O(N)O(N),其中 NN 是链表中的元素个数
    • 空间复杂度:O(1)O(1),因为只需要常数的空间

    自己实现的,只不过没考虑到环,但是也差不多这个意思吧

    class Solution{
    public:
        ListNode* rotateRight(ListNode* head,int k)
        {
            //特殊情况1
            if(head==NULL || head->next==NULL) return head;
            ListNode* p=head;
            ListNode* pre=NULL;
            ListNode* lastNode=NULL;
            int count_num=0;
            //统计总数
            while(p!=NULL)
            {
                count_num++;
                lastNode=p;
                p=p->next;
            }
        
            //做处理,防止周期性移动
            k=k%count_num;
            //特殊情况2
            if(k==0)  
                return head;
            //p归位
            p=head;
            for(int i=0;i<count_num-k;i++)
            {
                pre=p;
                p=p->next;
            }
            pre->next=NULL;
            lastNode->next=head;
            head=lastNode;
            return head;
     
        }
    };

    我这样写就多了个k=0的情况的分析,而形成环之后就不用考虑这个特殊情况,因为永远没有哪个结点的下一个结点是NULL

  • 相关阅读:
    如何用Android Studio打多包名APK
    EventBus框架在Android多Pane(Fragment)中的应用
    Android WebView使用深入浅出
    dp和px转换
    android button minheight问题
    Java链式编程接口
    Java多线程共享变量控制
    一致性Hash算法
    ARP (地址解析协议)
    FTP下载导致Zip解压失败的原因
  • 原文地址:https://www.cnblogs.com/renzmin/p/11884523.html
Copyright © 2020-2023  润新知