做题笔记8(单链表删除重复元素,找到数组的中间元素)


一、 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-该值-值左边的和,故可减少循环次数,减少用时。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值