当前位置:   article > 正文

Leetcode之92. 反转链表 II_acm leetcode92

acm leetcode92

提交记录

执行结果:
在这里插入图片描述

解题思路:

  1. 将l、r指针分别分配到区间开始位置与结束位置(注意边界问题);
  2. 用p、q指针在反转区间开始反转链表(注意首先将反转区间的第一个结点的next指向空);
  3. 将三短区间链接;

语言:C++

class Solution {
public:
    ListNode* reverseBetween(ListNode* head, int left, int right) {
        while(left==right||head->next==NULL){return head;}
        
        ListNode *dummy=new ListNode(-1);
        dummy->next=head;
        ListNode *l=dummy;
        ListNode *r=dummy;
        ListNode *p=NULL;
        ListNode *q=NULL;
        ListNode *n=NULL;
        
        left=left-1;
        while(left){
            l=l->next;
            left--; 
        }        
        while(right+1){
            r=r->next;
            right--; 
        }

        p=l->next;
        q=p->next;
        
        p->next=NULL;
        n=p;
            
        while(q!=r){
            ListNode *s=q->next;
            q->next=p;
            p=q;
            q=s;
        }
        l->next=p;
        n->next=r;

        return dummy->next;

    }
};
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42

细节提升

1.边界问题

自己写示例把边界问题测试一下,插入哨兵节点可以避免很多边界问题。

        ListNode *dummy=new ListNode(-1);
        dummy->next=head;

        return dummy->next;
  • 1
  • 2
  • 3
  • 4

2.插入左右边界

        left=left-1;
        while(left){
            l=l->next;
            left--; 
        }        
        while(right+1){
            r=r->next;
            right--; 
        }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号