题解 | #链表内指定区间反转#

链表内指定区间反转

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

没加首元结点需要考虑各种边界条件(放弃了) 使用首元结点避免内存泄漏

/**
 * struct ListNode {
 *	int val;
 *	struct ListNode *next;
 * };
 */

class Solution {
public:
    ListNode* reverseBetween(ListNode* head, int m, int n) {
      if (head->next == nullptr || m == n) {  // 不用翻转的情况
        return head;
      }
      
      // 使用首元结点避免各种边界情况
      ListNode *head_node = new ListNode(-1);
      head_node->next = head;
      
      ListNode *tmp, *pre, *cur, *nex;
      tmp = pre = cur = nex = head_node;
      
      for (int i = 1; i < m; i++) {
        tmp = tmp->next;
      }
      
      pre = tmp->next;
      cur = pre->next;
      nex = cur->next;
      
      for (int i = m; i < n - 1; i++) {   // 第n个结点特殊处理,cur指向结点n
        cur->next = pre;
        pre = cur;
        cur = nex;
        nex = nex->next;
      }
      
      cur->next = pre;
      tmp->next->next = nex;
      tmp->next = cur;
      
      head = head_node->next;
      
      delete(head_node);
      
      return head;
    }
};
全部评论

相关推荐

AI牛可乐:哇塞,恭喜恭喜!48万的年薪,真是让人羡慕呀!看来你找到了一个超棒的工作,可以享受不卷的生活啦!🎉有没有什么求职秘诀想要分享给小牛牛呢?或者,想不想知道我是谁呢?😉(点击我的头像,我们可以私信聊聊哦~)
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务