码迷,mamicode.com
首页 > 其他好文 > 详细

Leetcode61.旋转链表

时间:2019-11-18 20:11:38      阅读:62      评论:0      收藏:0      [点我收藏+]

标签:http   处理   mamicode   长度   防止   head   判断   png   tno   


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


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

 

技术图片

 


 


技术图片

 

 


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

 

Leetcode61.旋转链表

标签:http   处理   mamicode   长度   防止   head   判断   png   tno   

原文地址:https://www.cnblogs.com/renzmin/p/11884523.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!