C++ 实现单链表创建、插入和删除的攻略如下:
创建单链表
创建一个单链表需要先定义一个链表节点结构体,包含两个元素:一个是节点的值,另一个是指向下一个节点的指针。
struct ListNode {
int val;
ListNode *next;
ListNode(int x) : val(x), next(NULL) {}
};
定义好节点结构体之后,就可以通过循环来创建链表了。首先定义一个头节点,作为链表的起始节点,然后通过循环不断创建新的节点,并将其插入到链表中。
ListNode* createList(vector<int> nums) {
ListNode *head = new ListNode(0); // 创建头节点
ListNode *tail = head; // 将tail指向头节点,用于记录链表的尾节点
for (auto num : nums) {
ListNode *p = new ListNode(num); // 创建新节点
tail->next = p; // 将新节点插入到链表的尾部
tail = p; // 更新尾节点
}
return head->next; // 返回链表的第一个节点(头节点的next指向第一个节点)
}
这里采用了一个vector来存储链表的元素,方便数据的输入和处理。同时也可以手动输入链表元素,只需要将vector替换成类似int arr[]的形式即可。
以下示例展示如何创建一个包含3个元素{1, 2, 3}的单链表,并打印输出:
vector<int> nums = {1, 2, 3};
ListNode *head = createList(nums);
while (head != NULL) {
cout << head->val << " ";
head = head->next;
}
// 输出结果:1 2 3
插入节点
在单链表中插入节点要分两种情况:在指定位置插入新节点和在尾部插入新节点。
在指定位置插入新节点
在指定位置插入新节点,需要先找到插入节点的位置。可以通过循环遍历链表来实现,将遍历到的节点作为参照,找到插入节点的位置,然后将新节点插入到该位置。
ListNode* insertNode(ListNode *head, int index, int val) {
if (index < 0) { // 无效的插入位置,直接返回原链表
return head;
}
ListNode *dummy = new ListNode(0);
dummy->next = head;
ListNode *prev = dummy;
ListNode *cur = head;
for (int i = 0; i < index && cur != NULL; i++) {
prev = prev->next;
cur = cur->next;
}
if (cur != NULL) { // 找到插入位置,将新节点插入
ListNode *p = new ListNode(val);
prev->next = p;
p->next = cur;
}
return dummy->next;
}
该函数需要传入链表的头节点、插入位置(从0开始)和插入节点的值。其中,dummy节点是为了避免链表头部插入时需要单独处理的情况。
以下示例展示如何在链表的第二个位置插入新节点4,并打印输出:
vector<int> nums = {1, 2, 3};
ListNode *head = createList(nums);
head = insertNode(head, 1, 4);
while (head != NULL) {
cout << head->val << " ";
head = head->next;
}
// 输出结果:1 4 2 3
在尾部插入新节点
在尾部插入新节点,可以直接遍历到链表的尾节点,然后将新节点插入到其后面。
ListNode* insertNode(ListNode *head, int val) {
ListNode *dummy = new ListNode(0);
dummy->next = head;
ListNode *prev = dummy;
ListNode *cur = head;
while (cur != NULL) { // 遍历链表,找到尾节点
prev = prev->next;
cur = cur->next;
}
ListNode *p = new ListNode(val); // 在尾部插入新节点
prev->next = p;
return dummy->next;
}
该函数需要传入链表的头节点和插入节点的值。
以下示例展示如何在链表的尾部插入新节点4,并打印输出:
vector<int> nums = {1, 2, 3};
ListNode *head = createList(nums);
head = insertNode(head, 4);
while (head != NULL) {
cout << head->val << " ";
head = head->next;
}
// 输出结果:1 2 3 4
删除节点
在单链表中删除节点同样需要分两种情况:删除指定位置的节点和删除值等于指定值的节点。
删除指定位置的节点
在删除指定位置的节点时,首先也需要找到该节点的位置,然后将该节点从链表中删除。
ListNode* deleteNode(ListNode *head, int index) {
if (index < 0) { // 无效的删除位置,直接返回原链表
return head;
}
ListNode *dummy = new ListNode(0);
dummy->next = head;
ListNode *prev = dummy;
ListNode *cur = head;
for (int i = 0; i < index && cur != NULL; i++) {
prev = prev->next;
cur = cur->next;
}
if (cur != NULL) { // 找到要删除的节点,将其从链表中删除
prev->next = cur->next;
delete cur;
}
return dummy->next;
}
该函数需要传入链表的头节点和要删除的节点位置。
以下示例展示如何删除链表的第二个节点,并打印输出:
vector<int> nums = {1, 2, 3};
ListNode *head = createList(nums);
head = deleteNode(head, 1);
while (head != NULL) {
cout << head->val << " ";
head = head->next;
}
// 输出结果:1 3
删除值等于指定值的节点
在删除值等于指定值的节点时,需要遍历整个链表,找到值等于指定值的节点,并将其删除。
ListNode* deleteNode(ListNode *head, int val) {
ListNode *dummy = new ListNode(0);
dummy->next = head;
ListNode *prev = dummy;
ListNode *cur = head;
while (cur != NULL) { // 遍历链表,找到要删除的节点
if (cur->val == val) {
prev->next = cur->next;
delete cur;
break;
}
prev = prev->next;
cur = cur->next;
}
return dummy->next;
}
该函数需要传入链表的头节点和要删除的节点的值。
以下示例展示如何删除链表中值等于2的节点,并打印输出:
vector<int> nums = {1, 2, 3};
ListNode *head = createList(nums);
head = deleteNode(head, 2);
while (head != NULL) {
cout << head->val << " ";
head = head->next;
}
// 输出结果:1 3
以上就是C++实现单链表创建、插入和删除的完整攻略和两条示例说明。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C++ 实现单链表创建、插入和删除 - Python技术站