力扣刷题5

60 阅读1分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第4天,点击查看活动详情


题目描述

点击直达题目链接 26. 删除有序数组中的重复项 在这里插入图片描述 在这里插入图片描述

解题思路

我们用两个下标i,j进行标记。i进行遍历数组,j用于和i对应的数进行比较。不同时才移动。 具体玩法: i,j从开始进行匹配查找,当i,j指向的数相等时,i移动,j不动。当i和j指向的数不相等时,j移动一位,然后把i对应的值覆盖给j对应的值,接着i再移动。直到i遍历完整个数组。 在这里插入图片描述

代码

int removeDuplicates(int* nums, int numsSize){
    int i=0,j=0;
    while(i<numsSize)
    {
        if(nums[i]==nums[j])
        {
            i++;
        }
        else
        {
            j++;
            nums[j]=nums[i];
            i++;
        }
    }
    return j+1;
}

反转链表

在这里插入图片描述

解题思路

==指针反转法==

这里我们直接把节点的指针进行反转就行,反转的时候要注意保存好下一个节点的地址和上一个节点的地址。 n1表示当前节点的上一个节点的地址 n2表示当前节点 n3表示当期节点的下一个节点的地址

==节点插入法== 我们创建新的头节点的地址,原链表中的每个节点一个一个进行头插

代码

==指针反转法==

struct ListNode* reverseList(struct ListNode* head){
    if(head==NULL)
    return head;
    struct ListNode* n1,*n2,*n3;
    n1=NULL;
    n2=head;
    n3=head->next;
    while(n3)
    {
        n2->next=n1;

        n1=n2;
        n2=n3;
        n3=n2->next;
    }
    n2->next=n1;
    return n2;
}

==节点插入法==

struct ListNode* reverseList(struct ListNode* head){
    struct ListNode* newhead=NULL;
    
    while(head)
    {
        struct ListNode* cur=head;
        head=head->next;
        
        cur->next=newhead;
        newhead=cur;
       
    }
    return newhead;
}