一开始我以为很简单,但是实际做的时候发现自己还是有些没考虑到。
当要删除的在中间的时候,我想的是把下个结点的值拷贝过来,然后删除下一个;但是等到要删除的是最后一个的时候,麻烦就出现了,怎么都解决不了。看了书上的解法,是用去找next的值。这个果然就能解决了。唉,年轻
#include <iostream>
#include <string>
#include <string.h>
using namespace std;
struct LinkNode
{
int value;
LinkNode *next;
LinkNode() : value(0), next(NULL) {}
LinkNode(int val) : value(val), next(NULL) {}
LinkNode(int val, LinkNode *ptr) : value(val), next(ptr) {}
};
LinkNode *ESlink()
{
int x;
LinkNode *head = new LinkNode();
LinkNode *res = head;
while (cin >> x)
{
head->next = new LinkNode(x);
head = head->next;
}
return res->next;
}
void RemoveNode(LinkNode *&thead, int val)
{
if (thead == NULL)
return;
LinkNode *DeleteNode = NULL;
if (thead->value == val)
{
DeleteNode = thead;
thead = thead->next;
}
else
{
LinkNode *pmove = thead;
while (pmove->next != NULL && pmove->next->value != val)
pmove = pmove->next;
if (pmove->next != NULL && pmove->next->value == val)
{
DeleteNode = pmove->next;
pmove->next = pmove->next->next;
}
}
if (DeleteNode != NULL)
{
delete DeleteNode;
DeleteNode = NULL;
}
}
void play(LinkNode *head)
{
while (head != NULL)
{
cout << head->value << " ";
head = head->next;
}
cout << endl;
}
int main()
{
int val;
cin >> val;
LinkNode *head = ESlink();
play(head);
RemoveNode(head, val);
play(head);
return 0;
}