当前位置:主页 > 查看内容

弄懂LeetCode三道题

发布时间:2021-07-09 00:00| 位朋友查看

简介:系列文章目录 文章目录 系列文章目录 前言 一、调整奇偶数顺序 1.题目描述 2.解题思路 二、移除链表元素 1.题目描述 2.解题思路 三、反转链表 1.题目描述 2.解题思路 总结 前言 一、调整奇偶数顺序 调整奇偶数顺序使奇数位于偶数前面 1.题目描述 输入一个整……

在这里插入图片描述

系列文章目录



前言


在这里插入图片描述

一、调整奇偶数顺序

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

1.题目描述

输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分。
在这里插入图片描述

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 的节点,并返回 新的头节点 。
在这里插入图片描述在这里插入图片描述
在这里插入图片描述

2.解题思路

1.设置哨兵结点法:不用判断第一个值是否为val
在这里插入图片描述
代码如下:

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->next == 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图解:
在这里插入图片描述
第一个值不为val图解:
在这里插入图片描述

代码如下:

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->next == 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
在这里插入图片描述
代码如下:

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.头插法:取原链表的结点依次头插到链表中
在这里插入图片描述
代码如下:

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;
}

总结

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

;原文链接:https://blog.csdn.net/qq_44918090/article/details/115689649
本站部分内容转载于网络,版权归原作者所有,转载之目的在于传播更多优秀技术内容,如有侵权请联系QQ/微信:153890879删除,谢谢!

推荐图文


随机推荐