活动介绍

c语言实现编程实现:输入一个正整数 repeat (0<repeat<10),做 repeat 次下列运算: 输入一个正整数 n(0<n<=9)和一组(n个)整数,建立一个单向链表,再输入一个整数 x,将链表中最后一个与x相等的整数删除。 输入输出示例:括号内为说明 输入样例: 3 (repeat=3) 5 (数据的个数n=5) 1 2 4 3 7 (5个整数) 4 (待删除整数x=4) 5 (数据的个数n=5) 2 1 5 7 5 (5个整数) 5 (待删除整数x=5) 3 (数据的个数n=3) 1 2 4 (3个整数) 100 (待删除整数x=100) 输出样例: size=4:1 2 3 7 size=4:2 1 5 7 size=3:1 2 4

时间: 2024-03-14 07:45:23 浏览: 110
以下是 C 语言实现: ```c #include <stdio.h> #include <stdlib.h> typedef struct ListNode { int val; struct ListNode* next; } ListNode; ListNode* deleteLastEqual(ListNode* head, int x) { ListNode* dummy = (ListNode*)malloc(sizeof(ListNode)); dummy->next = head; ListNode* prev = dummy; ListNode* curr = head; ListNode* last_node = NULL; while (curr) { if (curr->val == x) { last_node = curr; } prev->next = curr; prev = curr; curr = curr->next; } if (last_node) { prev->next = last_node->next; } return dummy->next; } void printList(ListNode* head) { int size = 0; int* nums = (int*)malloc(sizeof(int) * 10); while (head) { nums[size++] = head->val; head = head->next; } printf("size=%d:", size); for (int i = size - 1; i >= 0; i--) { printf("%d ", nums[i]); } printf("\n"); free(nums); } int main() { int repeat; scanf("%d", &repeat); for (int i = 0; i < repeat; i++) { int n; scanf("%d", &n); ListNode* head = NULL; for (int j = 0; j < n; j++) { int val; scanf("%d", &val); ListNode* node = (ListNode*)malloc(sizeof(ListNode)); node->val = val; node->next = head; head = node; } int x; scanf("%d", &x); head = deleteLastEqual(head, x); printList(head); ListNode* curr = head; while (curr) { ListNode* temp = curr; curr = curr->next; free(temp); } } return 0; } ``` 思路解析: 这个问题可以通过创建一个虚拟头节点 dummy,将它指向链表的头节点 head。然后用 prev 和 curr 指针遍历链表,prev 始终指向 curr 的前一个节点,curr 指向当前节点。如果 curr->val 等于 x,则将 last_node 指向 curr,表示找到与 x 相等的节点。遍历完后,如果 last_node 不为空,则删除 last_node 节点。 在构造链表时,我们需要不断地从输入中读取整数,每读一个整数就创建一个新的节点,并将它插入到链表的头部。最后得到的链表是逆序的。遍历链表,统计链表长度和节点值,最后输出即可。 需要注意的是,在释放链表节点的内存时,我们需要先遍历整个链表,将指针指向下一个节点,然后才能释放当前节点的内存。 时间复杂度分析: 遍历链表需要 O(n) 的时间复杂度,构造链表需要 O(n) 的时间复杂度,因此总的时间复杂度为 O(n)。
阅读全文

相关推荐