弄懂LeetCode三道题

系列文章目录


文章目录

  • 系列文章目录
  • 前言
  • 一、调整奇偶数顺序
        • 1.题目描述
        • 2.解题思路
  • 二、移除链表元素
        • 1.题目描述
        • 2.解题思路
  • 三、反转链表
        • 1.题目描述
        • 2.解题思路
  • 总结


前言


弄懂LeetCode三道题_第1张图片

一、调整奇偶数顺序

调整奇偶数顺序使奇数位于偶数前面

1.题目描述

输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分。
弄懂LeetCode三道题_第2张图片

2.解题思路

  1. malloc创建一块空间
  2. 遍历数组两遍,第一遍只存储奇数,第二遍只存储偶数。

代码如下:

int* exchange(int* nums, int numsSize, int* returnSize)
{
     
    int i=0;
    int s=0;
    int* str=(int*)malloc(sizeof(int)*numsSize);
    *returnSize=numsSize;
    for(i=0;i<numsSize;i++)
    {
     
        if(nums[i]%2==1)
        {
     
            str[s]=nums[i];
            s++;
        }
    }
    for(i=0;i<numsSize;i++)
    {
     
        if(nums[i]%2==0)
        {
     
            str[s]=nums[i];
            s++;
        }
    }
    return str;
}

二、移除链表元素

移除链表元素

1.题目描述

给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val == val 的节点,并返回 新的头节点 。
弄懂LeetCode三道题_第3张图片在这里插入图片描述
在这里插入图片描述

2.解题思路

1.设置哨兵结点法:不用判断第一个值是否为val
弄懂LeetCode三道题_第4张图片
代码如下:

struct ListNode* RemoveElements(struct ListNode* head, int val)
{
     
	struct ListNode* guardhead = (struct ListNode*)malloc(sizeof(struct ListNode*));
	guardhead->next = head;
	struct ListNode* prev = NULL;
	struct ListNode* cur = head;
	while (cur)
	{
     
		if (cur->val == val)
		{
     
			struct ListNode* next = cur->next;
			prev->next = next;
			free(cur);
			cur = next;
		}
		else
		{
     
			prev = cur;
			cur = cur->next;
		}
	}
	guardhead->next = head;
	free(guardhead);
	return head;
}

2.不设置哨兵结点法:判断第一个值为val和第一个值不为val的情况

第一个值是val图解:
弄懂LeetCode三道题_第5张图片
第一个值不为val图解:
弄懂LeetCode三道题_第6张图片

代码如下:

struct ListNode* RemoveElements(struct ListNode* head, int val)
{
     
	struct ListNode* cur = head;
	struct ListNode* prev = NULL;
	while (cur)
	{
     
		struct ListNode* next = cur->next;
		if (cur->val == val)
		{
     
			if (prev == NULL)  //第一个结点的值就是val
			{
     
				free(cur);
				head = next;
				cur = next;
			}
			else
			{
     
				prev->next = next;
				free(cur);
				cur = next;
			}
		}
		else
		{
     
			prev = cur;
			cur = cur->next;
		}
	}
}

三、反转链表

反转链表

1.题目描述

定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点。
在这里插入图片描述

2.解题思路

1.三指针法:定义指针1为NULL,定义指针2为head指针,定义指针3为head->next
弄懂LeetCode三道题_第7张图片
代码如下:

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

		//迭代
		n2 = n3;
		n1 = n2;
		if (n3)
		{
     
			n3 = n3->next;
		}
	}
	return n1;
}

2.头插法:取原链表的结点依次头插到链表中
弄懂LeetCode三道题_第8张图片
代码如下:

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

总结

本文仅仅简单介绍了链表常见的两题,这些题目我们以后可能会遇到,我们务必掌握。另外,如果上述有任何问题,请懂哥指教,不过没关系,主要是自己能坚持,更希望有一起学习的同学可以帮我指正,但是如果可以请温柔一点跟我讲,爱与和平是永远的主题,爱各位了。
弄懂LeetCode三道题_第9张图片

你可能感兴趣的:(数据结构,c,链表,指针)