题目:请完成下面这个类的方法代码,请实现带头结点的单链表
class Link
{
public:
Link(); //构造函数
~Link(); //析构函数
void insertHead(int val); //头插法
void insertTail(int val); //尾插法
void deleteNode(int val); //删除链表所有值为val的节点
private:
class Node
{
public:
Node(int data=0):_data(data), _pnext(NULL){}
int _data;
Node *_pnext;
};
Node *_phead;
};
实现
构造函数
Link::Link()
{
_phead =new Node();
}
题目中,有个内置类,这个类是关于节点的,有节点值,也有节点的下一个指针。
析构函数
Link::~Link()
{
Node *point = _phead->_pnext;
while (point !=NULL)
{
_phead->_pnext = point->_pnext;
delete point;
point = _phead->_pnext;
}
delete point;
_phead = NULL;
}
需要动态删除每一个节点。
头节点插入元素
void Link::insertHead(int val)
{
Node *point = new Node(val);
point->_pnext = _phead->_pnext;
_phead->_pnext = point;
}
使用内置节点生成一个节点元素,并将该节点挂在头节点之后。
尾节点插入元素
void Link::insertTail(int val)
{
Node *point = new Node(val);
Node *p = _phead;
while (p->_pnext !=NULL)
{
p = p->_pnext;
}
p->_pnext = point;
}
首先查找尾节点,然后把新节点挂到尾节点之后,新节点就成为了尾节点。
删除链表所有值为val的节点
void Link::deleteNode(int val)
{
Node *point = _phead;
Node *pcur = _phead->_pnext;
while (pcur!=NULL)
{
if (pcur->_data==val)
{
point->_pnext = pcur->_pnext;
delete pcur;
pcur = point->_pnext;
}
point = pcur;
if (pcur!=NULL) //如果需要删除的元素是最后一个,则此时的pcur==null,故不能再取_pnext值
{
pcur = pcur->_pnext;
}
}
}
首先查找满足条件的节点,最后将该节点删除。并且需要注意最后一个判断。
测试函数
int main(int argc, _TCHAR* argv[])
{
Link link;
link.show();
link.insertHead(1);
link.show();
link.insertHead(2);
link.show();
link.insertHead(3);
link.show();
link.insertTail(4);
link.show();
link.insertTail(5);
link.show();
link.insertTail(1);
link.show();
link.deleteNode(1);
link.show();
return 0;
}
运行结果:
欢迎指正!