6-2 单链表结点删除(20 分)_单链表的删除节点的两种方式——还是双指针和链表覆盖好用
2017-10-14 12:56
525 查看
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的结点删除。返回指向结果链表头结点的指针。
裁判测试程序样例:
/* 你的代码将被嵌在这里 */
输入样例:
10 11 10 12 10 -1
10
输出样例:
11 12
本题要求实现两个函数,分别将读入的数据存储为单链表、将链表中所有存储了某给定值的结点删除。链表结点定义如下:
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; }
相关文章推荐
- 无头节点的单循环链表中删除指针s所指结点的前驱结点
- 设一个没有头结点指针的单链表。一个指针指向此单链表中间的一个结点(不是第一个,也不是最后一个结点),将该结点从单链表中删除,要求时间复杂度O(1)。
- 链表之无头指针删除单链表指定结点
- (转)问题:假设一个没有头指针的单链表。一个指针指向此单链表中间的一个节点(既不是第一个,也不是最后一个节点),请将该节点从单链表中删除。
- 有一个单项的链表,在没有头结点的情况下,只知道有一个指向结点B的指针p,假设这个结点B不是尾结点,删除该节点B。
- 单链表的创建和遍历、求单链表中节点的个数、查找单链表中的中间结点、判断单链表是否有环、取出有环链表中环的长度,删除有序链表中的重复结点
- 以指针和引用两种参数实现删除单链表L中所有值为X的结点的函数
- 设ha和hb分别是两个带头节点的费递减有序单链表的表头指针,设计以算法,将将两个有序链表合成一个非递减的有序单链表,该程序以以前发表的博客中的链表中的区别在与该立案表带有头结点
- (转)问题:假设一个没有头指针的单链表。一个指针指向此单链表中间的一个节点(既不是第一个,也不是最后一个节点),请将该节点从单链表中删除。
- 链表中删除指定结点的两种方式
- 数据结构:设有一个不带头结点的单链表L,设计两个递归算法,del(L,x)删除单链表L中第一个值为x的节点,delall(L,x)删除单链表L中的最小节点值。
- C/C++ | 28-20 写出程序删除链表中的所有节点
- 13 在O1的时间删除链表节点-使用一个节点指针
- 雅虎面试题─有两个双向循环链表A,B,知道其头指针为:pHeadA,pHeadB,请写一函数将两链表中data值相同的结点删除
- 009实现一个算法来删除单链表中的一个结点,仅仅给出指向那个结点的指针(keep it up)
- 链表问题 在单链表和双链表中删除倒数第K个节点
- 单链表---删除无头单链表的非尾结点(不遍历链表)
- 数据结构之链表面试题汇总(四)得到两个单链表相交的第一个交点、用O(1)的时间效率删除单向链表中的指定节点
- java 链表结点的删除的两种方法
- 给定一个节点指针 删除单链中当前结点