用带头结点的单链表实现查找序号为i(1≤i≤n)的元素 ,查找第一个值为x的元素,插入第i(2≤i≤n)个元素,删除第i(2≤i≤n)个元素 (c++)
时间: 2024-01-24 18:05:26 浏览: 27
好的,我来为您解答这个问题。
首先,需要定义一个带头结点的单链表节点结构体,包括元素值和指向下一个节点的指针:
```c++
struct ListNode {
int val;
ListNode* next;
ListNode(int x) : val(x), next(nullptr) {}
};
```
接下来,需要实现一个查找序号为i的元素的函数,可以通过遍历链表来实现:
```c++
ListNode* findNodeByIndex(ListNode* head, int index) {
if (index < 1) {
return nullptr;
}
ListNode* cur = head->next;
int count = 1;
while (cur != nullptr && count < index) {
cur = cur->next;
count++;
}
return cur;
}
```
然后,需要实现一个查找第一个值为x的元素的函数,同样可以通过遍历链表来实现:
```c++
ListNode* findNodeByValue(ListNode* head, int x) {
ListNode* cur = head->next;
while (cur != nullptr && cur->val != x) {
cur = cur->next;
}
return cur;
}
```
接下来,需要实现一个插入第i个元素的函数,同样可以通过遍历链表来实现:
```c++
void insertNode(ListNode* head, int index, int x) {
ListNode* prev = findNodeByIndex(head, index - 1);
if (prev == nullptr) {
return;
}
ListNode* newNode = new ListNode(x);
newNode->next = prev->next;
prev->next = newNode;
}
```
最后,需要实现一个删除第i个元素的函数,同样可以通过遍历链表来实现:
```c++
void deleteNode(ListNode* head, int index) {
ListNode* prev = findNodeByIndex(head, index - 1);
if (prev == nullptr || prev->next == nullptr) {
return;
}
ListNode* delNode = prev->next;
prev->next = delNode->next;
delete delNode;
}
```
完整代码如下:
```c++
#include <iostream>
using namespace std;
struct ListNode {
int val;
ListNode* next;
ListNode(int x) : val(x), next(nullptr) {}
};
ListNode* findNodeByIndex(ListNode* head, int index) {
if (index < 1) {
return nullptr;
}
ListNode* cur = head->next;
int count = 1;
while (cur != nullptr && count < index) {
cur = cur->next;
count++;
}
return cur;
}
ListNode* findNodeByValue(ListNode* head, int x) {
ListNode* cur = head->next;
while (cur != nullptr && cur->val != x) {
cur = cur->next;
}
return cur;
}
void insertNode(ListNode* head, int index, int x) {
ListNode* prev = findNodeByIndex(head, index - 1);
if (prev == nullptr) {
return;
}
ListNode* newNode = new ListNode(x);
newNode->next = prev->next;
prev->next = newNode;
}
void deleteNode(ListNode* head, int index) {
ListNode* prev = findNodeByIndex(head, index - 1);
if (prev == nullptr || prev->next == nullptr) {
return;
}
ListNode* delNode = prev->next;
prev->next = delNode->next;
delete delNode;
}
int main() {
ListNode* head = new ListNode(-1);
ListNode* node1 = new ListNode(1);
ListNode* node2 = new ListNode(2);
ListNode* node3 = new ListNode(3);
head->next = node1;
node1->next = node2;
node2->next = node3;
// 查找序号为2的元素
ListNode* node = findNodeByIndex(head, 2);
if (node != nullptr) {
cout << "find node by index: " << node->val << endl;
}
// 查找值为2的元素
node = findNodeByValue(head, 2);
if (node != nullptr) {
cout << "find node by value: " << node->val << endl;
}
// 在第3个位置插入元素4
insertNode(head, 3, 4);
ListNode* cur = head->next;
while (cur != nullptr) {
cout << cur->val << " ";
cur = cur->next;
}
cout << endl;
// 删除第2个位置的元素
deleteNode(head, 2);
cur = head->next;
while (cur != nullptr) {
cout << cur->val << " ";
cur = cur->next;
}
cout << endl;
return 0;
}
```