两数相加和mylist(单链表)

版权声明:所有文章版权归属博主个人 https://blog.csdn.net/weixin_41143631/article/details/88373893

给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。

如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。

您可以假设除了数字 0 之外,这两个数都不会以 0 开头。

示例:

输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 0 -> 8
原因:342 + 465 = 807

以上引用自LeetCode ,这个题目感觉有点意思,我自己顺便把list的插入写了一遍,然后做了一下。先贴solution类。

算法注释里有解释,mylist是我自己写的不带头结点的单链表,放下面,就只有构造,析构,pushback(尾插)popback(尾删)和一个打印函数。大家自己做链表小代码的demo可以用一下。我的命名为了方便而已,大家写代码还是规范点,普通的还是驼峰命名,

class Solutionlist {
public:
	PNode listAdd( mylist& const list1,  mylist& const list2)
	{
		PNode l1 = list1.getPhead();//是list one的缩写,不要看错
		PNode l2 = list2.getPhead();
		listNode* dummy = new listNode(-1);//利用哑结点,避免list传入空的情况
		listNode* cur = dummy;
		int carry=0;//进位
		int sum = 0;// 对应位数
		while (l1 || l2)//l1或者l2不为空就一直循环,(不为空表示还有数字)
		{
			int data1 = (l1 ? l1->data : 0);
			int data2 = (l2 ? l2->data : 0);
			sum = data1 + data2 + carry;
			carry = sum / 10;
			cur->next = new listNode(sum % 10);//sum取值在0-18之间(0+0---9+9)
			cur = cur->next;
			if (l1 != nullptr)
			{
				l1 = l1->next;
			}
			if(l2!=nullptr)
			{
				l2 = l2->next;
			}

		}
		if (carry)
		{
			cur->next = new listNode(1);
		}
		return dummy->next;

	}
};

 listNode是个结构体,构造list结点,mylist是单链表,功能有forward_list的基本功能,当然省时间就没有泛型(模板)和迭代器之类的。

class listNode{
public :
	listNode(int data):data(data),next(nullptr){}
	listNode(const listNode& l) = delete;
	listNode& operator=(const listNode& l) = delete;

	int data;
	listNode* next;
};
typedef listNode* PNode;

class mylist {
public:
	mylist():phead(nullptr)
	{
		//cout << "开始构造" << endl;
	}
	mylist(mylist & l) = delete;
	mylist& operator = (const mylist& l) = delete;
	void push_back(int data)
	{
		listNode* newnode = new listNode(data);
		if (phead == nullptr)
		{
			phead = newnode;
			return;
		}
		PNode pcur = phead;
		while (pcur->next != nullptr)
			pcur = pcur->next;
		pcur->next = newnode;
	}
	void pop_back()
	{
		if (nullptr == phead)
			return;
		if (nullptr == phead->next)
		{
			delete(phead->next);//
			return;
		}
		auto pcur = phead;
		while (pcur->next->next != nullptr)
			pcur = pcur->next;
		delete(pcur->next);
		pcur->next = nullptr;

	}
	void push_front(int data)
	{
		PNode newnode = new listNode(data);
		if (phead == nullptr)
		{
			phead = newnode;
			return;
		}
		else
		{
			newnode->next = phead;
			phead = newnode;
		}

	}
	void pop_front()
	{
		if (phead == nullptr)
			return;
		if (phead->next == nullptr)
		{
			delete phead;
			phead = nullptr;
			return;
		}
		PNode pcur = phead->next;
		PNode pdel = phead;
		delete(pdel);
		pdel = nullptr;
		phead = pcur;

	}
	void print()
	{
		PNode pcur = phead;
		while (pcur != nullptr)
		{
			printf("%d--->",pcur->data);
			pcur = pcur->next;
		}
		cout << "nullptr";
	}

	~mylist()
	{//析构
		_destroy();
	}
	PNode getPhead()
	{
		return this->phead;
	}
	void setPhead(PNode& p)
	{
		phead = p;
	}
private:
	void _destroy()
	{
		while ((phead)!=nullptr)
		{
			PNode pcur = phead;
			phead = pcur->next;
			delete(pcur);
		}
	}
private:
	PNode phead;
};

然后我们的test函数做单元测试。

void print(PNode& phead)
{
	PNode pcur = phead;
	while (pcur != nullptr)
	{
		printf("%d--->", pcur->data);
		pcur = pcur->next;
	}
	cout << "nullptr";
}
/*省时间,我把打印链表设置为全局的,当然不用全局就得用get和set来配
置打印,比较麻烦,我的test下面的注释代码就是那种方式打印链表的
*/
void testListAdd()
{
	mylist listOne,listTwo;
	listOne.push_back(1);
	listOne.push_back(2);
	listOne.push_back(2);
	listOne.push_back(3);

	listTwo.push_back(2);
	listTwo.push_back(1);
	listTwo.push_back(3);
	listTwo.push_back(8);

	Solutionlist solution;
	auto result=solution.listAdd(listOne,listTwo);
	print(result);
	//mylist printflist;
	//printflist.setPhead(result);
	//printflist.print();

}
int main()
{
	testListAdd();
	return 0;

}

结果就这样了, 1-2-2-3  +    2-1-3-8   =    3-3-5-1-1(3221+8312=11533)

感觉这个可以做大数加减运算,貌似可以解决int只能存储2^31的问题。

猜你喜欢

转载自blog.csdn.net/weixin_41143631/article/details/88373893