0
点赞
收藏
分享

微信扫一扫

力扣 92.反转链表II C语言版题解

自由情感小屋 2022-02-04 阅读 57

示例 1:

输入:head = [1,2,3,4,5], left = 2, right = 4
输出:[1,4,3,2,5]

思路:

1.遍历链表,将要反转的数据先储存在数组中,并记录要反转的长度。

2.重新遍历链表,从数组的最后一个数开始往前,向链表要反转的部分赋值。

3.当left==right,return head;即可。

如样例1:

把2 3 4 储存到数组,

之后按 4 3 2 的顺序从第2个节点开始重新赋值到链表。

下面是代码,代码中有注释。 

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */


struct ListNode* reverseBetween(struct ListNode* head, int left, int right){
    if(left==right) {
        return head;
    }//left=right,不需要反转,return head即可。

    struct ListNode* leftnode=NULL;//用来记录反转的初始位置
    int a[500]={0};
    struct ListNode* head0=head;

    int cnt=0;//用来判断是否发现左节点(开始反转的初始位置)
    int book=0;//记录链表中元素的位置
    int len=0;//要反转的长度

    //遍历链表。
    while(head0) {
        book++;

        //判断当前位置是否为left。
        if(book==left) {
            leftnode=head0;//记录下要反转的开始位置
            cnt=1;//cnt=1,表示发现左节点。
        }

        //发现左节点后开始赋值到数组,并计算长度。
        if(cnt>0) {
            a[len]=head0->val;//len开始为0。
            len++;
        }

        //到达右节点(反转结束的位置)停止链表遍历,跳出循环。
        if(book==right) {
            break;
        }
        head0=head0->next;
    }

    //从数组最后往前,把数组里的值赋值给要反转的部分。len记录了反转的长度。
    for(int i=len-1;i>=0;i--) {
        leftnode->val=a[i];
        leftnode=leftnode->next;
    }
    return head;
}
举报

相关推荐

0 条评论