三天两头——链表内指定区间反转

oj链接

a7928d89adf3400285dde1308bc4df2d.png

由于作者能力有限,第一次写的时候并没有考虑到头结点,无法很好的解决不同情况下返回head的问题,几次提交的结果都是失败,在看了大佬们的解题方法。谈不上分享,算是记录。

方法:头插迭代法

在链表前加一个表头(定位头结点),定义两个指针cur和next,一个指向当前节点,一个指下一个节点,遍历到m的位置时,后续采取头插,考虑好节点的指针指向,就可以实现指定区域的反转了。

图解:

db13eb5fa3bb43019ff7397d9af00149.png

 

代码实现:

/**
 * struct ListNode {
 *	int val;
 *	struct ListNode *next;
 * };
 */
/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 * 
 * @param head ListNode类 
 * @param m int整型 
 * @param n int整型 
 * @return ListNode类
 */
#include <stdio.h>
struct ListNode* reverseBetween(struct ListNode* head, int m, int n ) {
    // write code here
    if(m==n)
    {
        return head;
    }
    if(head == NULL)
    {
        return head;
    }
    struct ListNode* phead  = (struct ListNode*)malloc(sizeof(struct ListNode));
    phead->val = 666;
    phead->next = head;
    struct ListNode*prev = phead;
    int i=0;
    for(i=0;i<m-1;i++)
    {
        prev = prev->next;
    }
    struct ListNode* cur = prev->next;
    struct ListNode* next ;
    for(i=0;i<n-m;i++)
    {
        next = cur->next;
        cur->next = next->next;      
        next->next = prev->next;
        prev->next = next;
    }
    return phead->next;
}

5be561f73f07474ba00954d8743102b7.jpeg

 

今天的分享就到这里,希望大家一起提高!!!

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值