链表的创建及输入输出 验证q= p->next q->next = p->next的情况

链表的创建及输入输出

#include<iostream>
#include<cstdlib>
#include<vector>

using namespace std;


struct ListNode {
	int val;
	ListNode* next;
	ListNode() : val(0), next(nullptr) {};
	ListNode(int x) : val(x), next(nullptr) {};
	ListNode(int x, ListNode* next) : val(x), next(next) {};
};

int main() {
	vector<int> a{2,4,3};

	auto dummy = new ListNode();
	auto tail = dummy;

	for (auto x : a) {
		auto node = new ListNode(x);
		tail = tail->next = node;
	}

	auto head = dummy->next;

	for (auto p = head;p;p = p->next) {
		cout << p->val << endl;

	}
	return 0;
}


验证q= p->next; q->next = p->next的情况

#include<iostream>
#include<cstdlib>
#include<vector>

using namespace std;


struct ListNode {
	int val;
	ListNode* next;
	ListNode() : val(0), next(nullptr) {};
	ListNode(int x) : val(x), next(nullptr) {};
	ListNode(int x, ListNode* next) : val(x), next(next) {};
};

int main() {
	vector<int> a{ 1, 2, 3, 4, 5};

	auto dummy = new ListNode();
	auto tail = dummy;

	for (auto x : a) {
		auto node = new ListNode(x);
		tail = tail->next = node;
	}

	auto head = dummy->next;
	auto t = head;

	for (auto p = head; p; p = p->next) {
		cout << p->val << endl;
		cout << p->next << endl;
	}


	t = head->next;
	cout << t->val << ' ' << t->next << endl;
	t->next = head->next;
	cout << t->val << ' '<< t->next << endl;


	return 0;
}



链表操作中,`p = p->next` 和 `p->next = p->next->next` 是两个非常关键且常见的赋值语句,它们的作用和效果截然不同,分别涉及指针的移动和节点的删除操作。 ### `p = p->next` 该语句用于将指针 `p` 移动到链表中的下一个节点。具体来说,`p->next` 表示当前节点的下一个节点的地址,将其赋值给 `p` 后,`p` 将指向下一个节点,从而实现链表的遍历操作。这种操作在链表的遍历、查找等场景中非常常见。 例如,在链表遍历过程中,`p = p->next` 可以逐个访问链表中的每个节点,直到 `p` 变为 `NULL`,表示已经到达链表的末尾[^3]。 ### `p->next = p->next->next` 该语句用于删除 `p` 所指向节点的下一个节点。具体来说,`p->next` 原本指向下一个节点,而 `p->next->next` 则是下下个节点的地址。将 `p->next` 指向下下个节点后,原来的下一个节点就从链表中被移除,不再被 `p` 所指向。这种操作通常用于链表的删除操作,例如在插入排序或分区操作中进行节点的移动[^2]。 需要注意的是,执行 `p->next = p->next->next` 之前,必须确保 `p->next` 和 `p->next->next` 都不为 `NULL`,否则可能会导致空指针异常。 ### 示例代码对比 #### `p = p->next` 示例 ```c struct Node { int data; struct Node* next; }; void traverseList(struct Node* head) { struct Node* p = head; while (p != NULL) { printf("%d ", p->data); p = p->next; // 移动指针到下一个节点 } } ``` #### `p->next = p->next->next` 示例 ```c struct Node { int data; struct Node* next; }; void removeNextNode(struct Node* p) { if (p != NULL && p->next != NULL) { p->next = p->next->next; // 删除下一个节点 } } ``` ### 总结 - `p = p->next` 用于指针的移动,是链表遍历的基础操作。 - `p->next = p->next->next` 用于节点的删除,是链表修改操作中的关键步骤。 两者在链表操作中扮演不同的角色,理解它们的区别对于掌握链表的操作至关重要。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值