今天试一下使用STL提供的常用容器与算法来解决一道简易算法题。
题目描述:
输入一个单向链表和一个节点的值,从单向链表中删除等于该值的节点,删除后如果链表中无节点则返回空指针。
链表的值不能重复。
构造过程,例如
1 <- 2
3 <- 2
5 <- 1
4 <- 5
7 <- 2
最后的链表的顺序为 2 7 3 1 5 4
删除 结点 2
则结果为 7 3 1 5 4
链表长度不大于1000,每个节点的值不大于10000。
本题含有多组样例。
输入描述:
1 输入链表结点个数
2 输入头结点的值
3 按照格式插入各个结点
4 输入要删除的结点的值
输出描述:
输出删除结点后的序列,每个数后都要加空格
输入
5 2 3 2 4 3 5 2 1 4 3
输出
2 5 4 1
思路
这道题在读懂题目上需要花时间。
1 <- 2
意思是在2是头结点,在2的后面插1
3 <- 2
意思是在2的后面插3,此时链表为:2 1 3
5 <- 1
4 <- 5
7 <- 2
这里的链表可以使用STL的list容器,算法可以使用find来查找指定元素,insert来插入,erase或者remove来删除。
代码
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <iostream>
#include <list>
#include <algorithm>
using namespace std;
void test01()
{
int count = 0;
int begin;
while (cin >> count >> begin)
{
list<int> l;
l.push_back(begin);
for (int i = 0; i < count - 1; i++)
{
int dest, src;
cin >> dest >> src;
list<int>::iterator pos;
pos = find(l.begin(), l.end(), src);
l.insert(++pos, dest);
}
int del;
cin >> del;
l.remove(del);
for (list<int>::iterator it = l.begin(); it != l.end(); it++)
{
cout << *it << " ";
}
cout << endl;
}
}
int main()
{
test01();
return 0;
}