题目描述
输入一个单向链表和一个节点的值,从单向链表中删除等于该值的节点,删除后如果链表中无节点则返回空指针。
链表结点定义如下:
struct ListNode
{
int m_nKey;
ListNode m_pNext;
};
详细描述:
本题为考察链表的插入和删除知识。
链表的值不能重复
构造过程,例如
1 <- 2
3 <- 2
5 <- 1
4 <- 5
7 <- 2
最后的链表的顺序为 2 7 3 1 5 4
删除 结点 2
则结果为 7 3 1 5 4*
输入描述:
1 输入链表结点个数
2 输入头结点的值
3 按照格式插入各个结点
4 输入要删除的结点的值
输出描述:
输出删除结点后的序列,每个数后都要加空格
示例1
输入
5
2
3 2
4 3
5 2
1 4
3
输出
2 5 4 1
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
struct ListNode {
int m_nKey;
struct ListNode* m_pNext;
};
int main()
{
struct ListNode* list ;
list = (struct ListNode *)malloc(sizeof(struct ListNode));
list ->m_pNext = NULL;
int count;
while(scanf("%d", &count) != EOF)
{
struct ListNode *hand = NULL;
hand = (struct ListNode *)malloc(sizeof(list));
list->m_pNext = hand;
hand->m_pNext = NULL;
scanf("%d", &(hand->m_nKey));
int i;
for(i = 0;i < count - 1; i++)
{
struct ListNode *new_listnode = (struct ListNode *)malloc(sizeof(struct ListNode));
new_listnode->m_pNext = NULL;
int cmp;
scanf("%d" "%d", &new_listnode->m_nKey, &cmp);
//printf("%d\n", new_listnode->m_nKey);
struct ListNode *p = list->m_pNext;
while(p->m_nKey != cmp)
{
p = p->m_pNext;
}
new_listnode->m_pNext = p->m_pNext;
p->m_pNext = new_listnode;
p = NULL;
}
int del;
struct ListNode *delete = list;
scanf("%d", &del);
while(delete->m_pNext->m_nKey != del)
{
delete = delete->m_pNext;
}
struct ListNode *q = delete->m_pNext;
delete->m_pNext = delete->m_pNext->m_pNext;
free(q);
delete = list->m_pNext;
while(delete != NULL)
{
printf("%d ", delete->m_nKey);
delete = delete->m_pNext;
}
}
return 0;
}