(十七)反转部分单向链表

【题目】给定一个单向链表的头节点head,以及两个整数from,to;在单向链表上把第from个节点到第to个节点这一部分进行反转

【举例】

1->2->3->4->5->6->NULL;from = 2,to = 5;

反转后链表为1->5->4->3->2->6->NULL
在这里插入图片描述
【解题思路】先把需要反转的部分反转,然后再连接

  • (1)判断边界条件;即1 <= from <= to <= N,若不满足,直接返回原来头节点
  • (2)找到第from-1个节点fpre和第to+1个节点tPos
  • (3)若fpre == NULL说明反转部分是包含头部节点【值得注意的部分】,则需要返回新的节点;若fpre不为NULL,则返回旧的头部节点
    请添加图片描述

【C++】

ListNode* reversePart(ListNode* head,int from,int to){
    int len = 0;
    ListNode* cur1 = head;
    ListNode* fPre = NULL;
    ListNode* tPos = NULL;
    while(cur1 != NULL){
        len++;
        fPre = (len == from -1 ? cur1 : fPre);
        tPos = (len == to + 1 ? cur1 : tPos);
        cur1 = cur1->next;
    }

    if(from > to || from < 1 || to > len){
        return head;
    }

    cur1 = (fPre == NULL ? head : fPre->next);//判断是否为头节点
    ListNode* cur2 = cur1->next;
    cur1->next = tPos;
    ListNode* next = NULL;

    while(cur2 != tPos){
        next = cur2->next;
        cur2->next = cur1;
        cur1 = cur2;
        cur2 = next;
    }

    if(fPre != NULL){
        fPre->next = cur1;
        return head;
    }
    return cur1;
}

【参考】程序员代码面试指南——左程云

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值