C++删除链表元素

xinzaichenmo 2017-07-02 04:38:08
原题的地址如下:http://www.lintcode.com/zh-cn/problem/remove-linked-list-elements/

删除链表中等于给定值val的所有节点。
样例
给出链表 1->2->3->3->4->5->3, 和 val = 3, 你需要返回删除3之后的链表:1->2->4->5。

看别人的博客上有这样的答案,居然还通过了。
但是看不太懂,于是打算调试一下,看一下原理。于是在VS2010上出现了问题。
首先,实现删除功能的代码段(在LinkList已经通过)如下:

/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
/**
* @param head a ListNode
* @param val an integer
* @return a ListNode
*/
ListNode *removeElements(ListNode *head, int val) {
// Write your code here
ListNode dummy;
dummy.next = head;
head = &dummy;

while (head->next != NULL) {
if (head->next->val == val) {
head->next = head->next->next;
} else {
head = head->next;
}
}

return dummy.next;
}
};


于是把它写完整了,在VS2010上出现的问题如图:


省去一些无关的代码,编译的较为完整的代码如下,错误在57行:
小白刚学链表,不懂的地方有很多。想问一下大家,这个错误该如何修改。或者如何更好地进行链表的实现?

#include<iostream>
using namespace std;

class Node{
public:
Node(int d):data(d),next(NULL){}
int data;
Node* next;
};
//NODE为节点定义

class LinkList{
public:
LinkList()
{
Head=NULL;
}
void init(Node *p)
{
Head=p;
}
void insert(Node*);//插入数据

void traverse(void(*visit)(Node*));//遍历链表,并显示出相应的值
Node *removeElements(Node *, int);//删除的主要程序
void destroy();//销毁链表

private:
Node* Head;
};//LINKLIST
//LinkList为链表定义

void LinkList::insert(Node *p)
{
//...
}//INSERT

void LinkList::destroy()
{
//...
}


void LinkList::traverse(void(*visit)(Node*))
{
//...
}

void printData(Node *p)
{
//...
}

Node* LinkList::removeElements(Node *head, int val) {


Node dummy;
dummy.next = head;
head = &dummy;

while (head->next != NULL) {
if (head->next->data == val) {
head->next = head->next->next;
} else {
head = head->next;
}
}

return dummy.next;
}


void main()
{
LinkList H;
Node *p;
cout<<"输入数字,只要换行就认为结束"<<endl;
while(1)
{
//输入数字
}


cout<<"输入一个数字"<<endl;
int intin;
cin>>intin;
H.removeElements(p,intin);
H.traverse(printData);//遍历,并在屏幕中显示结果
H.destroy();//销毁链表
cout<<endl;
system("pause");
//return 0;
}



完全版如下:

#include<iostream>
using namespace std;

class Node{
public:
Node(int d):data(d),next(NULL){}
int data;
Node* next;
};
//NODE为节点定义

class LinkList{
public:
LinkList()
{
Head=NULL;
}
void init(Node *p)
{
Head=p;
}
void insert(Node*);//插入数据

void traverse(void(*visit)(Node*));//遍历链表,并显示出相应的值
Node *removeElements(Node *, int);//lintcode里的一段程序
void destroy();//销毁链表

private:
Node* Head;
};//LINKLIST
//LinkList为链表定义

void LinkList::insert(Node *p)
{
p->next=Head;
Head=p;
}//INSERT
//将新节点p插入原链表


void LinkList::destroy()
{
Node* p;
Node* q;
for(p=Head;p;)
{
q=p->next;
delete p;
p=q;
}
Head=NULL;
}


void LinkList::traverse(void(*visit)(Node*))
{
Node* p;
for(p=Head;p;p=p->next)
visit(p);
}

void printData(Node *p)
{
cout<<p->data<<" ";

}//PRINTDATA

Node* LinkList::removeElements(Node *head, int val) {


Node dummy;
dummy.next = head;
head = &dummy;

while (head->next != NULL) {
if (head->next->data == val) {
head->next = head->next->next;
} else {
head = head->next;
}
}

return dummy.next;
}


void main()
{
LinkList H;
Node *p;
cout<<"输入数字,只要换行就认为结束"<<endl;
while(1)
{
int i;
cin>>i;

p=new Node(i);
H.insert(p);
cout<<"p的地址为"<<p<<endl;
cout<<"p->data的为"<<p->data<<endl;
cout<<endl;
if(cin.get()=='\n')
break;
}


cout<<"输入一个数字"<<endl;
int intin;
cin>>intin;
H.removeElements(p,intin);
H.traverse(printData);//遍历
H.destroy();
cout<<endl;
system("pause");
//return 0;
}


...全文
238 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
xinzaichenmo 2017-07-02
  • 打赏
  • 举报
回复
在开头添加了那个默认构造函数: 然后编译通过了。谢谢大家哈。 这是结果: 最后我还要把指向最后那个数字的指针改一下,不过这个问题就不麻烦大家了。
战在春秋 2017-07-02
  • 打赏
  • 举报
回复
错误提示很明确:没有定义默认构造函数。 可以这样定义默认构造函数
ListNode() : val(), next(NULL) {}
如果有帮助,请采纳答案好吗,谢谢!

64,654

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧