题解 | #【冲刺双百】链表内指定区间反转#

链表内指定区间反转

http://www.nowcoder.com/practice/b58434e200a648c589ca2063f1faf58c

按照指定区间反转列表

反转方法不再赘述,参考:BM1反转链表

考虑多种情况

1.对链表内部反转

最后结果中整个链表头结点没有改变,记录反转区间在原链表中的前置结点beg和后继结点end
此时beg.next为待反转的链表区间头结点,反转后令:
beg.next.next=nex;
beg.next=now
此时返回beg即可。

2.对链表后半部分反转

即n=链表长度:同1

3.对链表前一部分反转

即m=1:最后结果中整个链表头结点改变了,则反转后:
beg.next=now;
此时返回now即可。

public class Solution {
    public ListNode reverseBetween (ListNode head, int m, int n) {
    	//如果为空或m=n则直接返回head
        if(head.next==null||m==n) return head;
        int temp=m;//记录m的值,后续判断是否为第3种情况
        ListNode res=head;//记录原始链表头结点
        ListNode beg=head;//待反转链表头结点的前置结点
        while(--m>0){//寻找开始反转的位置
            beg=head;
            head=head.next;
            n-=1;
        }
        ListNode nex=head.next;
        ListNode las;
        while(--n>0){//反转
            las=head;
            head=nex;
            nex=head.next;
            head.next=las;
        }
        if(temp==1){//如果起始点为头结点,则最终结果头结点为原反转链表最后一个结点
            beg.next=nex;
            return head;
        }
        else{//如果起始点不是头结点,则最终结果头结点为原始头结点
            beg.next.next=nex;
            beg.next=head;
            return res;
        }

    }
}
全部评论

相关推荐

小鸡蛋吃布丁:上岸编制,考个偏远的四五线小县城的话那确实难度不高,工资三四千的,但是考发达地区的纯看实力和运气了
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
06-18 16:32
quench@0916:一顿操作猛如虎,一看工资2500
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务