LeetCode92. Reverse Linked List II

17 篇文章 0 订阅
9 篇文章 0 订阅

LeetCode92. Reverse Linked List II

原地址

题目描述

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

 For example:
 Given 1->2->3->4->5->NULL, m = 2 and n = 4,
 return 1->4->3->2->5->NULL.

 Note:
 Given m, n satisfy the following condition:

思路

首先根据m和n找到链表需要逆转的部分的头的前一个位置和尾的前一个位置,设为pBegin和pEnd(考虑到头结点前面没有结点,所以我们需要设置一个虚假头结点fake,使fake->next=head),初始化都指向fake。

ListNode* fake=new ListNode(0);
    fake->next = head;
    ListNode *pBegin=fake, *pEnd=fake;

    int distance = n - m ;
    while(pEnd && distance>0){
        pEnd = pEnd->next;
        distance--;
    } 
    while(pBegin && pEnd && m-1>0) {
        pBegin = pBegin->next;
        pEnd = pEnd->next;
        m--;
    }

然后设置一个p结点指向需逆转部分的头结点(p=pBegin->next),设置一个q结点指向需逆转部分的尾结点的后一结点(p=pEnd->next->next),并设置逆转后部分链表的头结点pHead,p插到原始q的后面,头结点pHead和p依次后移,直到p==q为止(具体看代码和图片(手绘……))

    ListNode *p = pBegin->next;
    ListNode *q = pEnd->next->next;

    ListNode *pHead = q;
    while(p != q){
        ListNode* node = p->next;
        p->next = pHead;
        pHead = p;
        p = node;
    }

转移图
最后将逆转部分的链表接入原链表

 pBegin->next = pHead;

代码实现

   /**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    ListNode* reverseBetween(ListNode* head, int m, int n) {
    if (head==NULL || m>=n) return head;

    ListNode* fake=new ListNode(0);
    fake->next = head;
    ListNode *pBegin=fake, *pEnd=fake;

    int distance = n - m ;
    while(pEnd && distance>0){
        pEnd = pEnd->next;
        distance--;
    } 
    while(pBegin && pEnd && m-1>0) {
        pBegin = pBegin->next;
        pEnd = pEnd->next;
        m--;
    }

    if (pBegin==NULL || pEnd==NULL || pEnd->next == NULL){
        return head;
    }

    ListNode *p = pBegin->next;
    ListNode *q = pEnd->next->next;

    ListNode *pHead = q;
    while(p != q){
        ListNode* node = p->next;
        p->next = pHead;
        pHead = p;
        p = node;
    }
    pBegin->next = pHead;

    return fake->next;
    }
};
ps: 这一题是看了GitHub上的题解,根据自己的思路写了总有些地方存在问题,不过仔细分析这份代码就当学习了吧!不会在博客里画图表,流程图这些东西 ,只好手绘了,大家见谅。有会画的大牛欢迎指导。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值