【来不及刷题之】24、反转链表 ||(双指针)

反转链表相关的高频题:

【来不及刷题之】6、反转链表(迭代、递归)_vector<>的博客-CSDN博客

【来不及刷题之】7、K个一组翻转链表(双指针)_将一个vector分为k个一组_vector<>的博客-CSDN博客

java

关键点:

  1. 要简单快捷地找到preStart和nextEnd以及start和end四个指针
  2. 一定要有dummy结点,因为会有从头到尾全部反转的情况,如果没有dummy结点,就找不到preStart了。

class Solution {
    public ListNode reverseBetween(ListNode head, int left, int right) {
        ListNode dummy=new ListNode();
        dummy.next=head;
        ListNode preStart=null, start=null, end=null, nextEnd=null, p=dummy; // 注意p指向的是dummy
        int i=0;
        while(p!=null){
            if(i==left-1){
                preStart=p;
                start=preStart.next;
            }
            if(i==right){
                end=p;
                nextEnd=end.next;
                break;
            }
            i++;
            p=p.next;
        }
        preStart.next=null;
        end.next=null;
        ListNode newHead=reverse(start);
        start.next=nextEnd;
        preStart.next=end;
        return dummy.next;
    }

    ListNode reverse(ListNode head){
        if(head==null || head.next==null) // 注意这里递归退出的条件是两个
            return head;
        ListNode newHead=reverse(head.next);  
        head.next.next=head;
        head.next=null;
        return newHead;
    }
}

 

c++

虽然时间复杂度,空间复杂度都不怎么样,好歹是自己写出来的

ListNode* reverseBetween(ListNode* head, int left, int right) {
        //创建头结点
        //标记第n+1个结点
        //标记第n个结点,并从n结点处断开
        //标记第m个结点,以便后续的连接工作
        //以m-1个结点为头结点,进行头插
        //将剩下的结点连接到链表尾部(表尾是原来的m处)
        if(head->next==nullptr||left==right)return head;

        ListNode* Dummy=new ListNode();//头结点
        Dummy->next=head;

        ListNode* m=nullptr;
        ListNode* n=nullptr;
        ListNode* m_1=Dummy;
        ListNode* n_1=nullptr;//m_1是m-1,n_1是n+1;

        int k=left;
        while(k-1!=0){
            m_1=m_1->next;
            k--;
        }
        m=m_1->next;//m_1是待翻转链表的头结点,m是链表反转后的尾结点
        n=m;
       

        while(right!=left){            
            n=n->next;
            right--;          
        } 

        n_1=n->next;//n是待翻转链表的尾结点,n_1是后序链表的头结点
        n->next=nullptr;//断开
   
        //初始化完毕,开始翻转
        m_1=reverse(m_1); 
        //将翻转后的链表和尾巴连起来            
        m->next=n_1;
        return Dummy->next ;

    }

    ListNode* reverse(ListNode* head){//头插法翻转     
        ListNode* p=nullptr;
        ListNode* q=nullptr;
        p=head->next;
        head->next=nullptr;        
        while(p!=nullptr){
            q=p->next;
            p->next=head->next;
            head->next=p;
            p=q;
        }
        return head;
     }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

vector<>

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值