ListNode* nextTemp = curr->next; curr->next = prev; prev = curr; curr = nextTemp;
时间: 2024-05-29 11:14:42 浏览: 17
这是一个反转单向链表的代码片段。这里使用了三个指针,分别为 `prev`、`curr` 和 `nextTemp`。
- `prev` 指向当前结点的前一个结点,初始值为 `nullptr`。
- `curr` 指向当前结点,初始值为链表的头结点。
- `nextTemp` 指向当前结点的下一个结点。
首先,将 `curr` 的 `next` 指针指向 `prev`,实现将当前结点反转。
然后,将 `prev` 指向当前结点 `curr`。这样,`prev` 就变成了下一个结点的前一个结点,为下一次循环做准备。
最后,将 `curr` 指向下一个结点 `nextTemp`,继续下一次循环,直到链表中的所有结点都被反转。
这段代码的时间复杂度为 O(n),其中 n 为链表的长度。
相关问题
#include <iostream> using namespace std; struct ListNode { int val; ListNode* next; ListNode(int x) : val(x), next(NULL) {} }; ListNode* insert(ListNode* head, int x) { ListNode* prev = NULL; ListNode* curr = head; while (curr != NULL && curr->val <= x) { prev = curr; curr = curr->next; } ListNode* node = new ListNode(x); if (prev == NULL) { node->next = head; return node; } else { node->next = prev->next; prev->next = node; return head; } } void printList(ListNode* head) { while (head != NULL) { cout << head->val << " "; head = head->next; } cout << endl; } int main() { int n, x; cin >> n; ListNode* head = NULL; for (int i = 0; i < n; i++) { int val; cin >> val; head = insert(head, val); } cin >> x; head = insert(head, x); printList(head); return 0; } 用c语言实现
以下是使用C语言实现的代码:
```c
#include <stdio.h>
#include <stdlib.h>
struct ListNode {
int val;
struct ListNode* next;
};
struct ListNode* insert(struct ListNode* head, int x) {
struct ListNode* prev = NULL;
struct ListNode* curr = head;
while (curr != NULL && curr->val <= x) {
prev = curr;
curr = curr->next;
}
struct ListNode* node = (struct ListNode*)malloc(sizeof(struct ListNode));
node->val = x;
if (prev == NULL) {
node->next = head;
return node;
} else {
node->next = prev->next;
prev->next = node;
return head;
}
}
void printList(struct ListNode* head) {
while (head != NULL) {
printf("%d ", head->val);
head = head->next;
}
printf("\n");
}
int main() {
int n, x;
scanf("%d", &n);
struct ListNode* head = NULL;
for (int i = 0; i < n; i++) {
int val;
scanf("%d", &val);
head = insert(head, val);
}
scanf("%d", &x);
head = insert(head, x);
printList(head);
return 0;
}
```
这个C语言版本的代码与C++版本的代码非常相似,只是语法和一些细节上有所不同。
帮我用C语言优化下面的代码,需要删除12后的数字void deleteNode(ListNode *head) { int i, j; for (i = 0, j = 0; i <head->val; i++) { if (head->val <= 12) { head=head->next; } else { head=head->next; } } }
根据你的要求,需要删除12后的数字,我对代码进行了优化,具体如下:
```
void deleteNode(ListNode *head) {
ListNode *prev = NULL, *curr = head;
while (curr != NULL) {
if (curr->val <= 12) {
if (prev == NULL) {
head = curr->next;
} else {
prev->next = curr->next;
}
ListNode *temp = curr;
curr = curr->next;
free(temp);
} else {
prev = curr;
curr = curr->next;
}
}
}
```
主要优化点如下:
1. 原代码中的 `i` 和 `j` 变量没有实际作用,可以删除。
2. 原代码中的循环条件 `i < head->val` 不符合实际需求,应该改为遍历整个链表。
3. 优化后的代码使用双指针(`prev` 和 `curr`)来遍历链表,遇到小于等于12的节点就删除,否则继续遍历。
4. 删除节点时需要注意修改前驱节点的指向,并释放节点占用的内存。
需要注意的是,优化后的代码可能会改变链表的头节点,因此函数的参数应该改为 `ListNode **head`,以便在函数内部修改头节点的指向。
另外,为了保证程序的健壮性,还需要添加一些异常处理代码,例如判断链表是否为空等。
相关推荐
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)