6-2 单链表结点删除(20 分)_单链表的删除节点的两种方式——还是双指针和链表覆盖好用
来源:互联网 发布:免费淘宝模板代码 编辑:程序博客网 时间:2024/05/24 04:26
6-2 单链表结点删除(20 分)
本题要求实现两个函数,分别将读入的数据存储为单链表、将链表中所有存储了某给定值的结点删除。链表结点定义如下:
struct ListNode {
int data;
ListNode *next;
};
函数接口定义:
struct ListNode *readlist();
struct ListNode *deletem( struct ListNode *L, int m );
函数readlist从标准输入读入一系列正整数,按照读入顺序建立单链表。当读到−1时表示输入结束,函数应返回指向单链表头结点的指针。
函数deletem将单链表L中所有存储了m的结点删除。返回指向结果链表头结点的指针。
裁判测试程序样例:
#include <stdio.h>#include <stdlib.h>struct ListNode { int data; struct ListNode *next;};struct ListNode *readlist();struct ListNode *deletem( struct ListNode *L, int m );void printlist( struct ListNode *L ){ struct ListNode *p = L; while (p) { printf("%d ", p->data); p = p->next; } printf("\n");}int main(){ int m; struct ListNode *L = readlist(); scanf("%d", &m); L = deletem(L, m); printlist(L); return 0;}
/* 你的代码将被嵌在这里 */
输入样例:
10 11 10 12 10 -1
10
输出样例:
11 12
#include <stdio.h>#include <stdlib.h>struct ListNode { int data; struct ListNode *next;};struct ListNode *readlist(){ struct ListNode *head, *p, *tail; head = (struct ListNode*)malloc(sizeof(struct ListNode)); head->next = NULL; p = head; while (1) { tail = (struct ListNode*)malloc(sizeof(struct ListNode)); scanf("%d", &tail->data); if (tail->data == -1) break; p->next = tail; p = tail; } p->next = NULL; return head;}struct ListNode *deletem(struct ListNode *L, int m){ //开双指针,还是不是很清楚下面的的代码为什么会抛出异常 //解决异常,其实去掉的是下下一个,还是双指针爽,可以直接覆盖头尾的情况; //其实仔细想一下,一定要有一个指针来记录前驱就一定要两个指针,一个访问,一个记录前一个 struct ListNode *head=L, *tail=L->next, *p=L; while (tail) { if (tail->data == m) { head->next = tail->next; free(tail); tail = head->next; continue; } head = head->next; tail = tail->next; } return p->next; /*struct ListNode *p=NULL, *head = L; L = L->next; while (L) { if (L->data == m) { p = L->next; L->next = p->next; p->next=NULL; free(p); } L = L->next; } return head->next; */}/*创建新链表覆盖法struct ListNode *deletem(struct ListNode *L, int m){ L = L->next; struct ListNode *p,*head,*tail; head = (struct ListNode*)malloc(sizeof(struct ListNode)); head->next = NULL; p = head; while (L) { if (L->data != m) { tail = (struct ListNode*)malloc(sizeof(struct ListNode)); tail->data = L->data; p->next = tail; p = tail; } L = L->next; } p->next = NULL; return head->next;}*/void printlist(struct ListNode *L){ struct ListNode *p = L; while (p) { printf("%d ", p->data); p = p->next; } printf("\n");}int main(){ int m; struct ListNode *L = readlist(); scanf("%d", &m); L = deletem(L, m); printlist(L); return 0;}
阅读全文
0 0
- 6-2 单链表结点删除(20 分)_单链表的删除节点的两种方式——还是双指针和链表覆盖好用
- 以指针和引用两种参数实现删除单链表L中所有值为X的结点的函数
- 给定单链表的头指针和一个结点指针,定义一个函数在O(1)时间删除该节点
- C语言实现单链表节点的删除(带头结点)
- java 链表结点的删除的两种方法
- 单链表的结点删除
- 不带头结点的单链表删除任意一个节点
- 删除没有头结点的链表指点节点操作
- 链表知识点(十)【删除带有头结点的单链表的第一个结点(包含数据的第一个节点)】
- 给定链表的头指针和一个结点指针,在O(1) 时间删除该结点
- 给定链表的头指针和一个结点指针,在O(1) 时间删除该结点
- 给定链表的头指针和一个结点指针,在O(1)时间删除该结点
- 给定链表的头指针和一个结点指针,在O(1)时间删除该结点。
- 给定链表的头指针和一个结点指针,在O(1)时间删除该结点
- 删除链表中的中间节点和 a/b 处的结点 Python 版
- 用二级指针删除单链表的一个节点
- 无头节点的单循环链表中删除指针s所指结点的前驱结点
- 链表结点的删除
- java 多线程之-阻塞队列
- OkHttp和RecyclerView结合使用,包含添加,删除,分割线
- 汽车费用(完全背包)
- Android开源框架简介
- muiH5前端框架和ssm后端框架开发移动混合app——过程
- 6-2 单链表结点删除(20 分)_单链表的删除节点的两种方式——还是双指针和链表覆盖好用
- 节食的限制(体积与权值相同的01背包)
- 使用Git拉取GitLab上的项目
- PAT乙1057. 数零壹(20)
- linux文件操作命令
- 淘宝联盟逆向笔记
- Ubuntu16.04 LTS 安装FFmpeg
- 单例模式
- HDU 4857