算法作业HW10:Leetcode92 Reverse Linked List II

Description:

Reverse a linked list from position m to n. Do it in-place and in one-pass.

Note:

For example:
Given 1->2->3->4->5->NULLm = 2 and n = 4,

return 1->4->3->2->5->NULL.

Solution:

  Analysis and Thinking:

题目不是将整个链表进行反转,而是把下标范围为[m,n]的节点进行反转,因此需要把整个链表分成三段,分别是待反转左段,待反转段,待反转右段。算法的重点在于处理带反转段的反转操作以及将三段进行反转后连接。

 

  Steps:

1.从链表头结点开始,遍历直到待反转段的起始位置,并用变量记录待反转起始点的前一个节点位置

2.从m到n开始,不断重复进行如下步骤:当前节点的next指针指向前一节点(这里用a->next以及PrePoint记录),再把前一节点PrePoint更新为当前节点,当前节点更新为其next指针指向的节点(即a=a->next),遍历完成后,完成反转

3.将链表的3个子段进行连接,主义,需要判断初始点是否为head头结点的位置以及结束点是否为尾节点的位置。


Codes:

class Solution {
public:
    ListNode *reverseBetween(ListNode *head, int m, int n) 
    {
        if(head==NULL)
            return NULL;
        
        ListNode *a=head;
        ListNode *b=NULL;
        
        for(int i=0;i<m-1;i++)  //对第一分段进行处理
        {
            b=a;
            a=a->next;
            
        }
        
        ListNode *endPoint=a;
        ListNode *PrePoint=a;
        
        for(int i=m+1;i<=n;i++)
        {
            ListNode *NextPoint=a->next;
            a->next=PrePoint;
            PrePoint=a;
            a=NextPoint;
        }
        
        endPoint->next=a;
        
        if(b)
            b->next=PrePoint;
        else
            head=PrePoint;
        
        return head;
    }
  
};



Results:


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值