我是靠谱客的博主 刻苦树叶,最近开发中收集的这篇文章主要介绍做题笔记8(单链表删除重复元素,找到数组的中间元素)一、 DS单链表—删除重复元素二.找到数组的中间位置,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

文章目录

  • 一、 DS单链表—删除重复元素
    • 1.题目
    • 2.解决方案
    • 3.反思
  • 二.找到数组的中间位置
    • 1.题目
    • 2.解法
    • 3.改进


一、 DS单链表—删除重复元素

1.题目

在这里插入图片描述

2.解决方案

#include<iostream>
using namespace std;

#define ok 0
#define error -1
class ListNode
{
public:
	int data;
	ListNode* next;
	ListNode()
	{
		next = NULL;
	}
};
class LinkList
{
public:
	ListNode* head;
	int len;
	LinkList();
	~LinkList();
	ListNode* LL_index(int i)
	{
		int j = 0;
		ListNode* p = head;
		while (p && j < i)
		{
			p = p->next;
			j++;
		}
		if (!p)
		{
			return NULL;
		}
		else
			return p;
	}
	int LL_get(int i)
	{
		if (i <= 0 || i > len)
		{
			return error;
		}
		ListNode* p;
		p = head;
		int j = 0;
		while (p && j < i)
		{
			p = p->next;
			j++;
		}
		if (!p)
		{
			return error;
		}
		else
			return p->data;
	}
	int LL_insert(int i, int item)
	{
		if (i <= 0 || i > len + 1)
		{
			return error;
		}
		ListNode* p;
		ListNode* s;
		p = LL_index(i - 1);
		s = new ListNode();
		s->data = item;
		s->next = p->next;
		p->next = s;
		len++;
		return ok;
	}
	int LL_del(int i)
	{
		if (i <= 0 || i > len)
		{
			return error;
		}
		ListNode* p;
		ListNode* s;
		p = LL_index(i - 1);

		s = p->next;
		p->next = s->next;
	
		delete s;

		len--;
		return ok;
	}
	void LL_display();
	void LL_lookfor()
	{
		int a, b;
		for (int i = 1; i < len; i++)
		{
			a = LL_get(i);
			for (int j = 1 + i; j <= len; j++)
			{
				b = LL_get(j);
				if (a == b)
				{
					LL_del(j);
					LL_lookfor();
				}
			}
		}

		
	}
};
LinkList::LinkList()
{
	head = new ListNode();
	len = 0;
}
LinkList::~LinkList()
{
	ListNode* p, * q;
	p = head;
	while (p != NULL)
	{
		q = p;
		p = p->next;
		delete q;
	}
	len = 0;
	head = NULL;
}
void LinkList::LL_display()
{
	ListNode* p;
	p = head->next;
	cout << len << ": ";
	while (p)
	{
		cout << p->data << " ";
		p = p->next;
	}
	cout << endl;
}
int main()
{	
	int t;
	cin >> t;
	while (t--)
	{
		int n;
		cin >> n;
		int temp;
		LinkList a;
		for (int i = 1; i <= n; i++)
		{
			cin >> temp;
			a.LL_insert(i, temp);
		}
		a.LL_lookfor();
		a.LL_display();
	}
	return 0;
}

3.反思

在经过多次调试后,才发现错误在判断、删除节点后,未进行嵌套,使得本该参与比较判断的节点上的值被忽略。

二.找到数组的中间位置

1.题目

题目

2.解法

class Solution {
public:
	int findMiddleIndex(vector<int>& nums) {
		int Middle;
		int f = -1;
		int n = nums.size();
		int sum1 = 0;
		int sum2 = 0;
		for (Middle = 0; Middle < n; Middle++)
		{
			for (int i = 0; i < Middle; i++)
			{
				sum1 += nums[i];
			}
			for (int i = Middle + 1; i < n; i++)
			{
				sum2 += nums[i];
			}
			if (sum1 == sum2)
			{
				f = 0;
				return Middle;
				break;
			}
			else
			{
				sum1 = 0;
				sum2 = 0;
			}
		}
		
		if (f == -1)
		{
			return f;
		}
        else
		{
			return Middle;
		}
    }
};

3.改进

class Solution {
public:
    int findMiddleIndex(vector<int>& nums) {
        int total=0;
        int len=nums.size();
        for(int i=0;i<len;i++)
        {
        total+=nums[i];
        } 
        int sum = 0;
        for (int i = 0; i < nums.size(); ++i) {
            if (2 * sum + nums[i] == total) {
                return i;
            }
            sum += nums[i];
        }
        return -1;
    }
};


改进后的解法,是先算出total的值,由于值右边的和=total-该值-值左边的和,故可减少循环次数,减少用时。

最后

以上就是刻苦树叶为你收集整理的做题笔记8(单链表删除重复元素,找到数组的中间元素)一、 DS单链表—删除重复元素二.找到数组的中间位置的全部内容,希望文章能够帮你解决做题笔记8(单链表删除重复元素,找到数组的中间元素)一、 DS单链表—删除重复元素二.找到数组的中间位置所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(65)

评论列表共有 0 条评论

立即
投稿
返回
顶部