题目一:程序填空 删除单链表中重复结点,重复结点只保留一个,head是单链表首结点指针 struct node *delete(struct node *head) { struct node *p,*q,*r,*tmp; //r指向q的前驱结点 p=q=head; for(p=head; ;p=p->next) {r=p; for(q=p->next;q!=NULL;) if(q->x==p->x) { ; tmp=q; q=q->next; free(tmp);} else {r=q; ;} } ;//返回删除重复结点的单链表头
时间: 2023-05-22 13:01:24 浏览: 107
以下是程序的完整代码:
struct node *delete(struct node *head) {
struct node *p, *q, *r, *tmp;
p = q = head;
for (p = head; p != NULL; p = p->next) {
r = p;
for (q = p->next; q != NULL;) {
if (q->x == p->x) {
tmp = q;
q = q->next;
free(tmp);
} else {
r = q;
q = q->next;
}
}
}
return head;
}
这个程序的作用是删除单链表中重复的结点,只保留一个。具体实现方法是,使用两个指针p和q,p指向当前结点,q指向p的下一个结点。如果q的值等于p的值,则删除q结点,否则将r指向q,q指向q的下一个结点。最后返回删除重复结点后的单链表头。
注意,这个程序只能删除相邻的重复结点,如果有多个重复结点不相邻,则只能保留第一个。如果需要删除所有重复结点,可以使用哈希表等数据结构来实现。
相关问题
用C语言删除单链表中重复结点,重复结点只保留一个,head是单链表首结点指针
以下是用C语言删除单链表中重复结点,重复结点只保留一个的代码:
```c
#include <stdio.h>
#include <stdlib.h>
struct ListNode {
int val;
struct ListNode *next;
};
struct ListNode* deleteDuplicates(struct ListNode* head) {
if (head == NULL || head->next == NULL) {
return head;
}
struct ListNode *p = head;
while (p->next != NULL) {
if (p->val == p->next->val) {
struct ListNode *temp = p->next;
p->next = temp->next;
free(temp);
} else {
p = p->next;
}
}
return head;
}
int main() {
struct ListNode *head = (struct ListNode*)malloc(sizeof(struct ListNode));
head->val = 1;
head->next = (struct ListNode*)malloc(sizeof(struct ListNode));
head->next->val = 1;
head->next->next = (struct ListNode*)malloc(sizeof(struct ListNode));
head->next->next->val = 2;
head->next->next->next = (struct ListNode*)malloc(sizeof(struct ListNode));
head->next->next->next->val = 3;
head->next->next->next->next = NULL;
head = deleteDuplicates(head);
while (head != NULL) {
printf("%d ", head->val);
head = head->next;
}
printf("\n");
return 0;
}
```
我的第二个问题是:lua closure factory 完整代码
己知单链表节点结构struct Node{Node* next}实现一个函数将单链表Node *head逆序
在C语言中,你可以通过迭代或者递归的方式实现单链表的反转。这里我提供一种常用的迭代方法:
```c
void reverseList(Node** head) {
if (*head == NULL || (*head)->next == NULL) { // 如果链表为空或只有一个节点,无需反转
return;
}
Node* prev = NULL; // 初始化前驱节点为NULL
Node* current = *head; // 当前节点初始化为头结点
Node* temp = NULL; // 临时节点
while (current != NULL) { // 遍历整个链表
temp = current->next; // 保存当前节点的下一个节点
current->next = prev; // 将当前节点的next指向前驱节点
prev = current; // 更新前驱节点为当前节点
current = temp; // 移动到下一个节点
}
*head = prev; // 更新新的头节点为原头节点的前一个
}
```
这个函数接受一个指向单链表头节点的指针,并直接修改了传入的头节点,使其指向反转后的链表。
阅读全文