美文网首页
LC206 翻转链表 &&LC92

LC206 翻转链表 &&LC92

作者: 锦绣拾年 | 来源:发表于2020-03-12 12:19 被阅读0次

    迭代写法
    遇到了一点点小小的坑
    自然而然想到三指针,但是一直超出时间限制
    后来看看别人的题解
    发现别人是用NULL head head->next
    我是用 head head->next head->next->next
    因此我需要让第一个head->next=NULL
    不然就会形成一个循环链表。

    /**
     * Definition for singly-linked list.
     * struct ListNode {
     *     int val;
     *     ListNode *next;
     *     ListNode(int x) : val(x), next(NULL) {}
     * };
     */
    class Solution {
    public:
        ListNode* reverseList(ListNode* head) {
            if(!head)
                return head;
            if(!head->next)
                return head;
            
    //         ListNode* fir=NULL;
    //         ListNode* sec=head;
            // ListNode*
            if(head->next &&!head->next->next){
                ListNode* current=head->next;
                current->next=head;
                head->next=NULL;//important
                return current;
            }
            ListNode* current=head->next->next;
            ListNode* fir=head;
            ListNode* sec=head->next;
            fir->next=NULL;//important 别人
    //         // sec=current->next;
    //         int i=0;
            while(current){ 
                sec->next=fir;
                fir=sec;
                sec=current;
                current=current->next;
            }
            sec->next=fir;
    //         // current->next=fir;
            return sec;
            
        }
    };
    

    92这个题复杂一点点
    执行用时 :0 ms, 在所有 C++ 提交中击败了100.00%的用户
    内存消耗 :8.6 MB, 在所有 C++ 提交中击败了23.84%的用户

    反转从位置 m 到 n 的链表。请使用一趟扫描完成反转。
    
    说明:
    1 ≤ m ≤ n ≤ 链表长度。
    
    示例:
    
    输入: 1->2->3->4->5->NULL, m = 2, n = 4
    输出: 1->4->3->2->5->NULL
    
    来源:力扣(LeetCode)
    链接:https://leetcode-cn.com/problems/reverse-linked-list-ii
    著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
    
    /**
     * Definition for singly-linked list.
     * struct ListNode {
     *     int val;
     *     ListNode *next;
     *     ListNode(int x) : val(x), next(NULL) {}
     * };
     */
    class Solution {
    public:
        ListNode* reverseBetween(ListNode* head, int m, int n) {
            int i=1;
            if(!head||!head->next)
                return head;
            if(m==n)
                return head;
            // if(head->next&&!head->next->next){
            //     ListNode* current=head->next;
            //     current->next=head;
            //     head->next=NULL;//important
            //     return current;
            // }
            ListNode* fir=NULL;
            ListNode* sec=head;
            ListNode* thi=head->next;
            
            while(i<m){
                fir=sec;
                sec=sec->next;
                i++;           
                thi=thi->next;
            }
            
            //i=m
            ListNode* newhead=fir;
            ListNode* newtail=sec;
            fir=NULL;
            while(i<n){
                sec->next=fir;
                fir=sec;
                sec=thi;
                thi=thi->next;
                i++;
            }
            
            sec->next=fir;
            if(newhead)
                newhead->next=sec;
            else{
                newtail->next=thi;
                return sec;
            }
                
            newtail->next=thi;
            return head;
            
            
    
        }
    };
    

    相关文章

      网友评论

          本文标题:LC206 翻转链表 &&LC92

          本文链接:https://www.haomeiwen.com/subject/ycxujhtx.html