C++链表练习

线性表是最简单的数据组织形式,通过单向链表我们可以建立小表单存储一些简单的数据。
下面就来做一个仓储管理的练习:
在这里插入图片描述在这里插入图片描述
Main函数已经给出:
在这里插入图片描述
那我们先定义好链表Goods类:

class Goods {
public:
	Goods(int sW) {
		singleWeight = sW;
		totalWeight += singleWeight;//构造函数增上单重量
	}
	~Goods() {
		totalWeight -= singleWeight;//析构函数减去单重量
	}
	int getSW() {
		return singleWeight;
	}
	static int TotalWeight() {
		return totalWeight;
	}	
	Goods * next;
private:
	static int totalWeight;//总重量
	int singleWeight;//单货重量
};

再写买进卖出函数:

//买进
void purchase(Goods *& front, Goods *rear, int w) {
	Goods *p = NULL;
	if (!front) {
		rear = new Goods(w);
		front = rear;
		return;
	}
	for (rear = front; rear; p = rear,
<think>好的,我现在需要处理用户关于C++链表练习的请求。首先,用户明确提到了想要查找相关的资料或代码示例,特别是数据结构方面的内容。用户之前可能已经接触过一些基本概念,比如快速排序,但现在是专注于链表。 首先,我需要确认用户的需求具体是什么。他们可能需要基础的链表操作示例,比如创建、插入、删除节点,或者更高级的应用,如反转链表、检测环、合并链表等。考虑到用户提供的引用中有关于多项式加法和LRU缓存的例子,但用户当前的问题集中在链表练习,所以应聚焦在链表的基本和常见操作上。 接下来,我需要确保回答符合用户指定的格式要求,包括正确使用LaTeX数学表达式,独立公式用$$...$$,行内公式用$...$。同时,生成相关的问题,并在引用处正确标注。但检查用户提供的引用内容,引用1是关于多项式相加的函数,引用2是快慢指针找链表中点的方法,引用3是LRU缓存的示例。这些引用中,引用2直接与链表相关,所以可能在回答中引用这个方法来展示链表操作。 用户可能需要看到代码示例,所以我会准备几个常见的链表练习题目及其C++实现。例如,链表反转、使用快慢指针找中间节点、检测环等。这些题目能帮助用户理解链表的结构和操作。 同时,需要确保代码正确且符合C++标准。例如,在链表的实现中,节点结构体的定义,指针的操作,内存管理(虽然可能不涉及动态分配,但需要注意避免内存泄漏)。不过,考虑到用户可能处于学习阶段,示例代码应尽量简洁,避免复杂的内存管理,可能使用智能指针或者简化版本。 另外,用户可能需要结构清晰的回答,逐步解释每个练习的实现步骤。例如,在反转链表时,可以分步说明如何调整指针指向,或者使用迭代和递归两种方法。 生成的相关问题应该围绕链表的不同操作和应用,比如如何检测环,如何合并两个有序链表链表排序方法等。这些问题能够引导用户进一步深入学习链表的相关知识。 最后,需要检查引用是否正确应用。例如,在讲解快慢指针找中间节点时,可以引用用户提供的引用2,说明这是最优方法。同时,确保回答中使用正确的中文表达,避免技术术语错误,并保持逻辑清晰。</think>以下为C++链表基础操作的三个典型练习示例,包含代码实现和原理说明。 ### 一、单链表反转(迭代法) ```cpp struct ListNode { int val; ListNode* next; ListNode(int x) : val(x), next(nullptr) {} }; ListNode* reverseList(ListNode* head) { ListNode *prev = nullptr; ListNode *curr = head; while (curr) { ListNode *nextTemp = curr->next; curr->next = prev; // 反转指针方向 prev = curr; // 前驱节点前进 curr = nextTemp; // 当前节点前进 } return prev; } ``` 时间复杂度$O(n)$,空间复杂度$O(1)$,通过修改指针方向实现原地反转[^2]。 ### 二、链表中环检测(快慢指针法) ```cpp bool hasCycle(ListNode *head) { ListNode *slow = head, *fast = head; while (fast && fast->next) { slow = slow->next; // 慢指针每次走1步 fast = fast->next->next; // 快指针每次走2步 if (slow == fast) { // 相遇说明存在环 return true; } } return false; } ``` 该方法时间复杂度$O(n)$,空间复杂度$O(1)$,利用相对速度差原理[^2]。 ### 三、合并两个有序链表 ```cpp ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) { ListNode dummy(0); // 哑节点简化操作 ListNode* tail = &dummy; while (l1 && l2) { if (l1->val <= l2->val) { tail->next = l1; l1 = l1->next; } else { tail->next = l2; l2 = l2->next; } tail = tail->next; } tail->next = l1 ? l1 : l2; // 连接剩余节点 return dummy.next; } ``` 该算法时间复杂度$O(m+n)$,空间复杂度$O(1)$,通过指针重组实现空间优化。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值