PTA题目集|6-2 单链表结点删除(20 分)_单链表的删除节点的两种方式——还是双指针和链表覆盖好用

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 #include 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
输出样例:
【PTA题目集|6-2 单链表结点删除(20 分)_单链表的删除节点的两种方式——还是双指针和链表覆盖好用】11 12
#include #include 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 =https://www.it610.com/article/= -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 =https://www.it610.com/article/= 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 =https://www.it610.com/article/= 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 = https://www.it610.com/article/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; }

    推荐阅读