我是靠谱客的博主 刻苦树叶,最近开发中收集的这篇文章主要介绍做题笔记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单链表—删除重复元素二.找到数组的中间位置所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复