华为机试题 --- 从单向链表中删除指定值的节点
#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