C++从单向链表中删除指定值的节点
从单向链表中删除指定值的节点
http://www.nowcoder.com/questionTerminal/f96cd47e812842269058d483a11ced4f
题意:由子节点和父节点的关系建立一个单链表,后输入的子节点是父节点的真正的下一个节点,之前的下一个节点后移,视为插入操作。
代码主要包含插入和删除两个子函数。
#include <bits/stdc++.h>
using namespace std;
struct ListNode
{
int val;
ListNode* next;
ListNode(int v, ListNode* p = nullptr) :val(v), next(p) {}
};
//插入节点
void InsertAfter(ListNode* fa, ListNode* ch)
{
ListNode* succ = fa->next;
fa->next = ch;
ch->next = succ;
}
//删除节点,并返回头结点
ListNode* DeleNode(ListNode* head, int val)
{
ListNode* prev = new ListNode(-1);//前置节点
prev->next = head;
head = prev;
while (head->next)
{
if (head->next->val == val)
{
head->next = head->next->next;
break;
}
head = head->next;
}
return prev->next;
}
int main()
{
int num = 0, val = 0;
while (cin >> num >> val)
{
ListNode* head = new ListNode(val);
ListNode* fath = head;
vector<pair<int, int>> vec;
int child, father,count = num - 1;
while (--num)
{
cin >> child >> father;
vec.push_back(make_pair(child, father));
}
//构建链表
while (count)
{
for (int i = 0; i < vec.size(); i++)
{
//寻找父节点
if (vec[i].second == fath->val)
{
//构造子节点
ListNode* node = new ListNode(vec[i].first);
//插入子节点
InsertAfter(fath, node);
//删除
//vec.erase(vec.begin() + i);
vec[i] = make_pair(-1, -1);
count--;
}
}
fath = fath->next;
}
//删除
int deleval = 0;
cin >> deleval;
head = DeleNode(head, deleval);
fath = head;
//输出
while (fath)
{
cout << fath->val << " ";
fath = fath->next;
}
cout << endl;
//销毁
while (head)
{
fath = head->next;
delete(head);
head = fath;
}
}
return 0;
}
查看9道真题和解析