#include<iostream>
#include<vector>
using namespace std;
struct LinkNode//链表结构体
{
int val;
LinkNode *next;
LinkNode(int val):val(val),next(nullptr){}
};
LinkNode *_dummyHead= new LinkNode(0);//头节点
void show(LinkNode *head)//展示
{
LinkNode *cur=head;//代替头节点,方便遍历
while(cur!=nullptr)
{
cout<<cur->val<<" ";
cur=cur->next;
}
cout<<endl;
}
LinkNode* reverse(LinkNode *head)//反致链表
{
LinkNode *temp;
LinkNode *per=nullptr;//前置节点,挺不好想,需要temp,per,cur
LinkNode *cur=head;
while(cur)
{
temp=cur->next;//保存下一个节点
cur->next=per;//开始反制了,先节点指向前节点
per=cur;
cur=temp;
}
return per;
}
int main()
{
int n, num;
while(cin>>n)
{
if(n==0)
{
cout<<"list is empty"<<endl;
continue;
}
LinkNode *cur=_dummyHead;//此处定义应在循环里面
while(n--)
{
cin>>num;
LinkNode *newnode= new LinkNode(num);
cur->next=newnode;
cur=cur->next;
}
show(_dummyHead->next);
show(reverse(_dummyHead->next));
}
return 0;
}
下面这道题,希望你手到擒来 ,两题结构上基本一致,除细微删除输出,可以建立数组,将不重复数字加入,每次判断是否有输出资格,用flag来标记,这里我为什么使用vector容器,因为之前建立的固定数组,总是判定为可能存在数字越界问题,主要因为输入的数组大小也不固定。num.push_back将数字加入到容器尾部,不影响输出,num数组只作为重复性检查
#include<iostream>
#include<vector>
using namespace std;
struct linknode {
int val;
linknode* next;
linknode(int val) :val(val), next(NULL) {}
};
linknode* dummyhead = new linknode(0);
void deletemult(linknode* head)
{
linknode* cur = head;
vector<int> num;
int count = 0;
while (cur != nullptr)
{
int flag = 1;
for (int j = 0; j < count; j++)
{
if (num[j] == cur->val)
{
flag = 0;
break;
}
}
if (flag)
{
//cout<<cur->val<<" ";
num.push_back(cur->val);
cout <<cur->val << " ";
count++;
}
cur = cur->next;
}
cout << endl;
}
void show(linknode* head)
{
linknode* cur = head;
while (cur != NULL)
{
cout << cur->val << " ";
cur = cur->next;
}
cout << endl;
}
int main()
{
int n, m;
while (cin >> n)
{
if (n == 0)
{
cout << "list is empty" << endl;
continue;
}
linknode* cur = dummyhead;
while (n--)
{
cin >> m;
linknode* newnode = new linknode(m);
cur->next = newnode;
cur = cur->next;
}
show(dummyhead->next);
deletemult(dummyhead->next);
}
return 0;
}