华为机试题 --- 从单向链表中删除指定值的节点

#include <iostream>
using namespace std;
struct ListNode
{
    int  m_nKey;
    ListNode* m_pNext;
};
void insertNode(ListNode* head, int input, int indexVal)
{
    ListNode* curptr = head,*curnext;
    while ( curptr != nullptr && curptr -> m_nKey != indexVal)
    {
        curptr = curptr -> m_pNext;   //指针指向下一个结点
    }            // 经过while后,指针定位到要找的位置处
    ListNode* temptr = new ListNode; //新建一个结点
    temptr -> m_nKey = input;        //存入值到结点
    curnext = curptr -> m_pNext;    
    curptr -> m_pNext = temptr;
    temptr -> m_pNext = curnext;     // 三步完成结点的插入
    
}
void delNode( ListNode* head, int input)
{
    ListNode* curptr = head, *precur;
    if (curptr -> m_nKey == input)     // 头结点单独处理
    {
        head = head -> m_pNext;
        delete curptr;
    }
    curptr = head -> m_pNext;
    precur = head;
    while (curptr != nullptr && curptr -> m_nKey != input)
    {      
        curptr = curptr -> m_pNext;   //指针指向下一个结点
        precur = precur -> m_pNext;   
    }  
    precur -> m_pNext = curptr -> m_pNext;
    delete curptr;
}
void disVal( ListNode* head )
{
    ListNode* curptr = head;
    while ( curptr != nullptr )
    {
        cout <<curptr->m_nKey << " ";  // 最后一个数字后边也有空格,不然过不了
        curptr = curptr -> m_pNext;   //指针指向下一个结点
    }
    cout << endl;     //大坑啊, 加了一句换行就过了
}
int main ()
{
    int num = 0, headVal = 0, delVal = 0;
    int input,indexVal;
    while ( cin >> num )     // 不知道为啥还要循环检测,真是坑
    {
        cin >> headVal;
        ListNode* head = new ListNode;
        head -> m_nKey = headVal;
        head ->m_pNext = nullptr;
        for ( int i = 0; i < num - 1; i++)
        {
            cin >> input >> indexVal;
            insertNode( head, input, indexVal);
        
        }
        cin >> delVal;
        delNode( head, delVal );
        disVal( head );
    }
    
    return 0;
}

 题目描述 bug太多

题目描述

输入一个单向链表和一个节点的值,从单向链表中删除等于该值的节点,删除后如果链表中无节点则返回空指针。

链表结点定义如下:

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 输入要删除的结点的值



输出描述:

输出删除结点后的序列


输入例子:
5
2
3 2
4 3
5 2
1 4
3

输出例子:
2 1 5 4
原文地址:https://www.cnblogs.com/simplepaul/p/6753281.html