虽然说是参考 不过是我自己写的 经过我并不严谨但还算凑合的测试 代码应该都没什么问题且符合题意 语言为C++
写这个的主要目的就是我很讨厌答案里面给的那种 形参是个指针变量 还要加个引用 你是从俄罗斯来的人吗 别的没学会就学会一手套娃?
王道p40 问题1
#include<iostream>
#include<iomanip>
#include<string>
#include<fstream>
#include<cmath>
#include<vector>
#include<stack>
#include<cstdio>
#include<array>
#include<vector>
#include<map>
#include<queue>
using namespace std;
typedef struct Lnode
{
int data;
struct Lnode* next;
}Lnode, * LinkList;
void printLInkwithouthead(LinkList s)
{
while (s != nullptr)
{
cout <<setw(5)<< s->data;
s = s->next;
}
}
void digui_delete(LinkList &s, int x)
{
if(s == nullptr)
{
return;
}
else if(s->data==x)
{
s = s->next;
digui_delete(s, x);
}
else
{
digui_delete(s->next, x);
}
}
int main()
{
cout << "请生成链表" << endl;
Lnode a={5,NULL };
LinkList s = &a;
for (int i = 0; i < 10; i++)
{
int data;
cin >> data;
LinkList newnode = new Lnode{ data,NULL};
s->next = newnode;
s = s->next;
}
s = &a;
printLInkwithouthead(s);
cout << endl;
digui_delete(s, 5);
printLInkwithouthead(s);
}
王道 p40 问题2 时间复杂度O(n) 空间复杂度O(1)
#include<iostream>
#include<iomanip>
#include<string>
#include<fstream>
#include<cmath>
#include<vector>
#include<stack>
#include<cstdio>
#include<array>
#include<vector>
#include<map>
#include<queue>
using namespace std;
typedef struct Lnode
{
int data;
struct Lnode* next;
}Lnode, * LinkList;
void funx(LinkList s, int x)
{
LinkList p = s->next;
if (p == NULL)
{
return;
}
else if (p->data == x)
{
if (p->next == NULL)
{
s->next = NULL;
free(p);
return;
}
else
{
p->data = p->next->data;
LinkList next = p->next;
p->next = p->next->next;
free(p->next);
funx(s, x);
}
}
else
{
funx(p, x);
}
}
void printLink(LinkList s)
{
while (s->next != NULL)
{
s = s->next;
cout<<setw(4)<< s->data;
}
cout << endl;
}
int main()
{
cout << "请生成链表" << endl;
Lnode a={ -1,NULL };
LinkList s = &a;
for (int i = 0; i < 10; i++)
{
int data;
cin >> data;
LinkList newnode = new Lnode{ data,NULL};
s->next = newnode;
s = s->next;
}
LinkList p = &a;
cout << "输出链表" << endl;
printLink(p);
funx(p, 3);
printLink(p);
}
当然也能用尾指针的办法解决这个问题
#include<iostream>
#include<iomanip>
#include<string>
#include<fstream>
#include<cmath>
#include<vector>
#include<stack>
#include<cstdio>
#include<array>
#include<vector>
#include<map>
#include<queue>
using namespace std;
typedef struct Lnode
{
int data;
struct Lnode* next;
}Lnode, * LinkList;
void printLink(LinkList s) //带头节点输出
{
while (s->next != NULL)
{
s = s->next;
cout << setw(4) << s->data;
}
cout << endl;
}
void rear_deletex(LinkList s, int x)
{
LinkList rear = s;
s = s->next;
rear->next = NULL; //注意这一行代码 考虑全是x得情况 如果没有这个 那么输出会保持不变
while (s != NULL)
{
if (s->data != x)
{
rear->next = s;
rear = rear->next;
s = s->next;
rear->next = NULL;
}
else
{
LinkList p = s;
s = s->next;
free(p);
}
}
}
int main()
{
cout << "请生成链表" << endl;
Lnode a={-1,NULL }; //头结点
LinkList s = &a;
for (int i = 0; i < 10; i++)
{
int data;
cin >> data;
LinkList newnode = new Lnode{ data,NULL};
s->next = newnode;
s = s->next;
}
s = &a;
int x = 5;
printLink(s);
rear_deletex(s, x);
printLink(s);
}
问题4
#include<iostream>
#include<iomanip>
#include<string>
#include<fstream>
#include<cmath>
#include<vector>
#include<stack>
#include<cstdio>
#include<array>
#include<vector>
#include<map>
#include<queue>
using namespace std;
typedef struct Lnode
{
int data;
struct Lnode* next;
}Lnode, * LinkList;
void minList(LinkList head)
{
LinkList premin = head;
LinkList p = head;
LinkList mins = p->next;
if (p ->next == nullptr)
{
cout << "空链表 说锤子" << endl;
return;
}
else
{
while(p->next!=nullptr)
{
LinkList s = p;
p = p->next;
if (p->data < mins->data)
{
premin = s;
mins = p;
}
}
}
premin->next = mins->next;
free(mins);
}
void printLink(LinkList s)
{
while (s->next != NULL)
{
s = s->next;
cout << setw(4) << s->data;
}
cout << endl;
}
int main()
{
cout << "请生成链表" << endl;
Lnode a={-1,NULL }; //头结点
LinkList s = &a;
for (int i = 0; i < 10; i++)
{
int data;
cin >> data;
LinkList newnode = new Lnode{ data,NULL};
s->next = newnode;
s = s->next;
}
s = &a;
printLink(s);
minList(s);
printLink(s);
}
问题五 就地逆置 这种一般递归吧 确实应该是就地逆置吧 我也没用什么别的东西 也有可能不是 因为从本质上来说 p这个变量可以用end代替 我想空间复杂度应该是O(1)的
#include<iostream>
#include<iomanip>
#include<string>
#include<fstream>
#include<cmath>
#include<vector>
#include<stack>
#include<cstdio>
#include<array>
#include<vector>
#include<map>
#include<queue>
using namespace std;
typedef struct Lnode
{
int data;
struct Lnode* next;
}Lnode, * LinkList;
void printLink(LinkList s) //带头节点输出
{
while (s->next != NULL)
{
s = s->next;
cout << setw(4) << s->data;
}
cout << endl;
}
void digui_reverse(LinkList Head, LinkList end, LinkList &front)
{
LinkList p = end;
if (p == nullptr)
{
return;
}
if (p->next != nullptr)
{
digui_reverse(Head, p->next, front);
if (p == front->next)
{
p->next = nullptr;
}
else
{
p->next = front->next;
front->next = p;
front = p;
}
}
else
{
p->next = front->next;
front->next = p;
front = p;
}
}
int main()
{
cout << "请生成链表" << endl;
Lnode a = { -1,NULL }; //头结点
LinkList s = &a;
for (int i = 0; i < 10; i++)
{
int data;
cin >> data;
LinkList newnode = new Lnode{ data,NULL };
s->next = newnode;
s = s->next;
}
s = &a;
int x = 5;
printLink(s);
LinkList front = s;
digui_reverse(s, s->next, front);
printLink(s);
}
这个算法写了挺久的因为递归很麻烦 看看书上怎么写吧 书上介绍了一种非常简单的头插法 、
#include<iostream>
#include<iomanip>
#include<string>
#include<fstream>
#include<cmath>
#include<vector>
#include<stack>
#include<cstdio>
#include<array>
#include<vector>
#include<map>
#include<queue>
using namespace std;
typedef struct Lnode
{
int data;
struct Lnode* next;
}Lnode, * LinkList;
void printLink(LinkList s) //带头节点输出
{
while (s->next != NULL)
{
s = s->next;
cout << setw(4) << s->data;
}
cout << endl;
}
void digui_reverse(LinkList Head)
{
LinkList p = Head->next;
LinkList temp;
if (p == nullptr) //空你说锤子
{
return;
}
while (p != nullptr)
{
temp= p->next;
p->next = Head->next;
Head->next = p;
if (p->next == p)
{
p->next = nullptr;
}
p = temp;
}
}
int main()
{
cout << "请生成链表" << endl;
Lnode a = { -1,NULL }; //头结点
LinkList s = &a;
for (int i = 0; i < 1; i++)
{
int data;
cin >> data;
LinkList newnode = new Lnode{ data,NULL };
s->next = newnode;
s = s->next;
}
s = &a;
int x = 5;
printLink(s);
LinkList front = s;
digui_reverse(s);
printLink(s);
}
当然也可以通过将头结点next域置为NULL的方式来确保链表最后指针域为空 当然你也可以简单粗暴的反转指针 阿巴阿巴
问题六 因为需要检测和头文件 构建链表 代码显然是要远超答案的 时间复杂度O(n^2) 空间复杂度O(1)
#include<iostream>
#include<iomanip>
#include<string>
#include<fstream>
#include<cmath>
#include<vector>
#include<stack>
#include<cstdio>
#include<array>
#include<vector>
#include<map>
#include<queue>
using namespace std;
typedef struct Lnode
{
int data;
struct Lnode* next;
}Lnode, * LinkList;
void printLink(LinkList s) //带头节点输出
{
while (s->next != NULL)
{
s = s->next;
cout << setw(4) << s->data;
}
cout << endl;
}
void sort_linkList(LinkList P)
{
LinkList nowp = P->next;//表示第一个节点
if (nowp == NULL || nowp->next == NULL)//表示没有节点或者只有一个节点
{
return;//显然不需要做任何操作
}
nowp = nowp->next; //表示第二个节点
P->next->next = NULL; //断链 使得链表只接上首节点
while (nowp != NULL) //该节点不为空
{
LinkList temp = nowp->next; //接上断链部分
LinkList pre = P;
LinkList compa = P->next; //表示比较的第一个节点
while (compa != NULL)
{
if (compa->data >= nowp->data) //表示插入位置
{
nowp->next = compa;
pre->next = nowp; //插入节点
break;
}
else
{
pre = compa;
compa = compa->next;
}
}
if (compa == NULL) //表示进行到了最后 这个节点是最大的
{
pre->next = nowp;
pre->next->next = NULL;
}
nowp = temp;
}
}
int main()
{
cout << "请生成链表" << endl;
Lnode a = { -1,NULL }; //头结点
LinkList s = &a;
for (int i = 0; i < 10; i++)
{
int data;
cin >> data;
LinkList newnode = new Lnode{ data,NULL };
s->next = newnode;
s = s->next;
}
s = &a;
int x = 5;
printLink(s);
sort_linkList(s);
printLink(s);
}
问题7
#include<iostream>
#include<iomanip>
#include<string>
#include<fstream>
#include<cmath>
#include<vector>
#include<stack>
#include<cstdio>
#include<array>
#include<vector>
#include<map>
#include<queue>
using namespace std;
typedef struct Lnode
{
int data;
struct Lnode* next;
}Lnode, * LinkList;
void printLink(LinkList s) //带头节点输出
{
while (s->next != NULL)
{
s = s->next;
cout << setw(4) << s->data;
}
cout << endl;
}
void delete_linklist(LinkList p,int max,int min)
{
LinkList nowp = p->next; //第一个节点
LinkList pre = p;
if (nowp == nullptr)
{
return;
}
while (nowp != nullptr)
{
if (nowp->data > min&& nowp->data < max)
{
pre->next = nowp->next;
nowp = pre->next;
}
else
{
pre = nowp;
nowp = nowp->next;
}
}
}
int main()
{
cout << "请生成链表" << endl;
Lnode a = { -1,NULL }; //头结点
LinkList s = &a;
for (int i = 0; i < 10; i++)
{
int data;
cin >> data;
LinkList newnode = new Lnode{ data,NULL };
s->next = newnode;
s = s->next;
}
s = &a;
int x = 5;
printLink(s);
delete_linklist(s, 20, 10);
printLink(s);
}
问题8
#include<iostream>
#include<iomanip>
#include<string>
#include<fstream>
#include<cmath>
#include<vector>
#include<stack>
#include<cstdio>
#include<array>
#include<vector>
#include<map>
#include<queue>
using namespace std;
typedef struct Lnode
{
int data;
struct Lnode* next;
}Lnode, * LinkList;
void printLink(LinkList s) //带头节点输出
{
while (s->next != NULL)
{
s = s->next;
cout << setw(4) << s->data;
}
cout << endl;
}
void Fun(LinkList A, LinkList B, int lengthA, int lengthB)
{
LinkList longN = lengthA > lengthB ? A : B;
LinkList shortN = lengthA < lengthB ? A : B;
int lengthx = abs(lengthA - lengthB);
for (int i = 0; i < lengthx; i++)
{
longN = longN->next;
}
while (longN != nullptr)
{
if (longN == shortN)
{
cout << longN->data << endl;
break;
}
longN = longN->next;
shortN = shortN->next;
}
}
int main()
{
cout << "请生成链表" << endl;
Lnode a = { -1,NULL }; //头结点
Lnode b = { -1,NULL };
Lnode c = { -1,NULL };
LinkList s = &a;
LinkList d = &b;
LinkList f = &c;
int lengthA;
int lengthB;
int lengthC;
cout << "请输入链表A长度" << endl;
cin >> lengthA;
cout << "请输入链表B长度" << endl;
cin >> lengthB;
cout << "请输入链表C长度" << endl; //C为共同内容
cin >> lengthC;
for (int i = 0; i < lengthA; i++)
{
int data;
cin >> data;
LinkList newnode = new Lnode{ data,NULL };
s->next = newnode;
s = s->next;
}
for (int i = 0; i < lengthB; i++)
{
int data;
cin >> data;
LinkList newnode = new Lnode{ data,NULL };
d->next = newnode;
d = d->next;
}
for (int i = 0; i < lengthC; i++)
{
int data;
cin >> data;
LinkList newnode = new Lnode{ data,NULL };
f->next = newnode;
f = f->next;
}
d->next = static_cast<LinkList>(&c)->next;
s->next = static_cast<LinkList>(&c) -> next;
s = &a;
d = &b;
int x = 5;
printLink(s);
printLink(d);
Fun(s, d, lengthA + lengthC, lengthB + lengthC);
}
第9题 显然可以通过头插法排序的方式有序化链表
#include<iostream>
#include<iomanip>
#include<string>
#include<fstream>
#include<cmath>
#include<vector>
#include<stack>
#include<cstdio>
#include<array>
#include<vector>
#include<map>
#include<queue>
using namespace std;
typedef struct Lnode
{
int data;
struct Lnode* next;
}Lnode, * LinkList;
void printLink(LinkList s) //带头节点输出
{
while (s->next != NULL)
{
s = s->next;
cout <<left << setw(4) << s->data;
}
cout << endl;
}
void fun(LinkList s)
{
LinkList nowp = s->next;
s->next = nullptr;
while (nowp != nullptr)
{
LinkList temp = nowp->next;
LinkList rear = s;
LinkList ori = s->next;
while (ori != nullptr)
{
if (ori->data > nowp->data)
{
nowp->next = ori;
rear->next = nowp;
break;
}
rear = ori;
ori = ori->next;
}
if (ori == nullptr)
{
nowp->next = nullptr;
rear->next = nowp;
}
nowp = temp;
}
}
void fun2(LinkList s)
{
s = s->next;
LinkList temp=s;
while (s!= nullptr)
{
cout << s->data<<endl;
temp->next = s->next;
free(s);
s = temp->next;
}
}
int main()
{
cout << "请生成链表" << endl;
Lnode a = { -1,NULL }; //头结点
LinkList s = &a;
int lengthA;
cout << "请输入链表A长度" << endl;
cin >> lengthA;
for (int i = 0; i < lengthA; i++)
{
int data;
cin >> data;
LinkList newnode = new Lnode{ data,NULL };
s->next = newnode;
s = s->next;
}
s = &a;
printLink(s);
fun(s);
printLink(s);
fun2(s);
printLink(s);
}
第10题 虽然不难 但是不要忘记把生成的两个链表表尾最后置为nullptr
#include<iostream>
#include<iomanip>
#include<string>
#include<fstream>
#include<cmath>
#include<vector>
#include<stack>
#include<cstdio>
#include<array>
#include<vector>
#include<map>
#include<queue>
using namespace std;
typedef struct Lnode
{
int data;
struct Lnode* next;
}Lnode, * LinkList;
void printLink(LinkList s) //带头节点输出
{
while (s->next != NULL)
{
s = s->next;
cout <<left << setw(4) << s->data;
}
cout << endl;
}
void fun(LinkList s,LinkList p,LinkList t)
{
LinkList tail1 = p; //尾指针1
LinkList tail2 = t; //尾指针2
int count = 0;
s = s->next; //表示s的第一个节点
while (s != nullptr)
{
++count;
if (count % 2 == 1) //奇数
{
tail1->next = s;
tail1 = tail1->next;
}
else
{
tail2->next = s;
tail2 = tail2->next;
}
s = s->next;
}
tail1->next = NULL;
tail2->next = NULL;
}
int main()
{
cout << "请生成链表" << endl;
Lnode a = { -1,NULL }; //头结点
Lnode b = { -1,NULL }; //头结点
Lnode c = { -1,NULL }; //头结点
LinkList s = &a;
LinkList p = &b;
LinkList t = &c;
int lengthA;
cout << "请输入链表A长度" << endl;
cin >> lengthA;
for (int i = 0; i < lengthA; i++)
{
int data;
cin >> data;
LinkList newnode = new Lnode{ data,NULL };
s->next = newnode;
s = s->next;
}
s = &a;
printLink(s);
fun(s, p, t);
printLink(p);
printLink(t);
}
第十一题 链表二用头插法逆置就可以了 大部分代码和第十题相同
#include<iostream>
#include<iomanip>
#include<string>
#include<fstream>
#include<cmath>
#include<vector>
#include<stack>
#include<cstdio>
#include<array>
#include<vector>
#include<map>
#include<queue>
using namespace std;
typedef struct Lnode
{
int data;
struct Lnode* next;
}Lnode, * LinkList;
void printLink(LinkList s) //带头节点输出
{
while (s->next != NULL)
{
s = s->next;
cout <<left << setw(4) << s->data;
}
cout << endl;
}
void fun(LinkList s,LinkList p,LinkList t)
{
LinkList tail1 = p; //尾指针1
LinkList head = t; //尾指针2
LinkList temp;
int count = 0;
s = s->next; //表示s的第一个节点
while (s != nullptr)
{
temp = s->next;
++count;
if (count % 2 == 1) //奇数
{
tail1->next = s;
tail1 = tail1->next;
}
else
{
s->next = head->next;
head->next = s;
}
s = temp;
}
tail1->next = NULL;
}
int main()
{
cout << "请生成链表" << endl;
Lnode a = { -1,NULL }; //头结点
Lnode b = { -1,NULL }; //头结点
Lnode c = { -1,NULL }; //头结点
LinkList s = &a;
LinkList p = &b;
LinkList t = &c;
int lengthA;
cout << "请输入链表A长度" << endl;
cin >> lengthA;
for (int i = 0; i < lengthA; i++)
{
int data;
cin >> data;
LinkList newnode = new Lnode{ data,NULL };
s->next = newnode;
s = s->next;
}
s = &a;
// printLink(s);
fun(s, p, t);
printLink(p);
printLink(t);
}
第十二题 递增有序 之前忘记保存了 但应该没问题
#include<iostream>
#include<iomanip>
#include<string>
#include<fstream>
#include<cmath>
#include<vector>
#include<stack>
#include<cstdio>
#include<array>
#include<vector>
#include<map>
#include<queue>
using namespace std;
typedef struct Lnode
{
int data;
struct Lnode* next;
}Lnode, * LinkList;
void printLink(LinkList s) //带头节点输出
{
while (s->next != NULL)
{
s = s->next;
cout <<left << setw(4) << s->data;
}
cout << endl;
}
void fun(LinkList s)
{
LinkList rear = s;
LinkList nowp = s->next;
if (nowp == nullptr)
{
return;
}
rear = nowp;
nowp = nowp->next;
while (nowp != nullptr)
{
if (nowp->data == rear->data)
{
rear->next = nowp->next;
free(nowp);
nowp = rear->next;
}
else
{
rear = nowp;
nowp = nowp->next;
}
}
}
int main()
{
cout << "请生成链表" << endl;
Lnode a = { -1,NULL }; //头结点
Lnode b = { -1,NULL }; //头结点
Lnode c = { -1,NULL }; //头结点
LinkList s = &a;
LinkList p = &b;
LinkList t = &c;
int lengthA;
cout << "请输入链表A长度" << endl;
cin >> lengthA;
for (int i = 0; i < lengthA; i++)
{
int data;
cin >> data;
LinkList newnode = new Lnode{ data,NULL };
s->next = newnode;
s = s->next;
}
s = &a;
printLink(s);
fun(s);
printLink(s);
}
第十三题
#include<iostream>
#include<iomanip>
#include<string>
#include<fstream>
#include<cmath>
#include<vector>
#include<stack>
#include<cstdio>
#include<array>
#include<vector>
#include<map>
#include<queue>
using namespace std;
typedef struct Lnode
{
int data;
struct Lnode* next;
}Lnode, * LinkList;
void printLink(LinkList s) //带头节点输出
{
while (s->next != NULL)
{
s = s->next;
cout <<left << setw(4) << s->data;
}
cout << endl;
}
void fun(LinkList s,LinkList p)
{
//为了装逼 我们直接把最后生成的链表放在s的头结点后面
LinkList now1 = s->next;
LinkList now2 = p->next;
s->next = NULL; //一号断链
LinkList temp;
while (now1 != NULL && now2 != NULL) //两个链表都没有结束
{
if (now1->data > now2->data)
{
//接上now2
temp = now2->next;
now2->next = s->next;
s->next = now2;
now2 = temp;
}
else
{
temp = now1->next;
now1->next = s->next;
s->next = now1;
now1 = temp;
}
}
// 循环结束 表示可比较部分比较完毕
if (now1 == nullptr) //now1 已经全部添加到新的链表中
{
while (now2 != nullptr)
{
temp = now2->next;
now2->next = s->next;
s->next = now2;
now2 = temp;
}
}
else
{
while (now1 != nullptr)
{
temp = now1->next;
now1->next = s->next;
s->next = now1;
now1 = temp;
}
}
}
int main()
{
cout << "请生成链表" << endl;
Lnode a = { -1,NULL }; //头结点
Lnode b = { -1,NULL }; //头结点
Lnode c = { -1,NULL }; //头结点
LinkList s = &a;
LinkList p = &b;
LinkList t = &c;
int lengthA,lengthB;
cout << "请输入链表A长度" << endl;
cin >> lengthA;
cout << "请输入链表B长度" << endl;
cin >> lengthB;
for (int i = 0; i < lengthA; i++)
{
int data;
cin >> data;
LinkList newnode = new Lnode{ data,NULL };
s->next = newnode;
s = s->next;
}
for (int i = 0; i < lengthB; i++)
{
int data;
cin >> data;
LinkList newnode = new Lnode{ data,NULL };
p->next = newnode;
p = p->next;
}
s = &a;
p = &b;
printLink(s);
printLink(p);
fun(s, p);
printLink(s);
}
第十四题 这道题要求生成的链表不利用原来的节点 那么子函数中需要使用new来创建新的链表节点 否则 子函数无法返回对应的节点标识
#include<iostream>
#include<iomanip>
#include<string>
#include<fstream>
#include<cmath>
#include<vector>
#include<stack>
#include<cstdio>
#include<array>
#include<vector>
#include<map>
#include<queue>
using namespace std;
typedef struct Lnode
{
int data;
struct Lnode* next;
}Lnode, * LinkList;
void printLink(LinkList s) //带头节点输出
{
while (s->next != NULL)
{
s = s->next;
cout << left << setw(4) << s->data;
}
cout << endl;
}
void fun(LinkList s, LinkList p, LinkList t)
{
//t为最后返回的节点 不需要设置引用
LinkList now1;
LinkList now2;
LinkList now3;
now1 = s->next;
now2 = p->next;
now3 = t;
while (now1 != NULL && now2 != NULL)
{
if (now1->data < now2->data)
{
now1 = now1->next;
}
else if(now1->data>now2->data)
{
now2 = now2->next;
}
else
{
LinkList newp =new Lnode{ now1->data,NULL };
now3->next = newp;
now3 = now3->next;
now1 = now1->next;
now2 = now2->next;
}
}
}
int main()
{
cout << "请生成链表" << endl;
Lnode a = { -1,NULL }; //头结点
Lnode b = { -1,NULL }; //头结点
Lnode c = { -1,NULL }; //头结点
LinkList s = &a;
LinkList p = &b;
LinkList t = &c;
int lengthA, lengthB;
cout << "请输入链表A长度" << endl;
cin >> lengthA;
cout << "请输入链表B长度" << endl;
cin >> lengthB;
for (int i = 0; i < lengthA; i++)
{
int data;
cin >> data;
LinkList newnode = new Lnode{ data,NULL };
s->next = newnode;
s = s->next;
}
for (int i = 0; i < lengthB; i++)
{
int data;
cin >> data;
LinkList newnode = new Lnode{ data,NULL };
p->next = newnode;
p = p->next;
}
s = &a;
p = &b;
printLink(s);
printLink(p);
fun(s, p,t);
//printLink(t);
printLink(t);
}
第十五题
#include<iostream>
#include<iomanip>
#include<string>
#include<fstream>
#include<cmath>
#include<vector>
#include<stack>
#include<cstdio>
#include<array>
#include<vector>
#include<map>
#include<queue>
using namespace std;
typedef struct Lnode
{
int data;
struct Lnode* next;
}Lnode, * LinkList;
void printLink(LinkList s) //带头节点输出
{
while (s->next != NULL)
{
s = s->next;
cout << left << setw(4) << s->data;
}
cout << endl;
}
void fun(LinkList s, LinkList p)
{
//t为最后返回的节点 不需要设置引用
LinkList now1;
LinkList now2;
LinkList now3;
now1 = s->next;
now2 = p->next;
now3 = s;
s->next = NULL;
while (now1 != NULL && now2 != NULL)
{
if (now1->data < now2->data)
{
now1 = now1->next;
}
else if(now1->data>now2->data)
{
now2 = now2->next;
}
else
{
now3->next = now1;
now3 = now3->next;
now1 = now1->next;
now2 = now2->next;
}
}
now3->next = NULL;
}
int* fun1()
{
int a[10];
return a;
}
int main()
{
cout << "请生成链表" << endl;
Lnode a = { -1,NULL }; //头结点
Lnode b = { -1,NULL }; //头结点
Lnode c = { -1,NULL }; //头结点
LinkList s = &a;
LinkList p = &b;
LinkList t = &c;
int lengthA, lengthB;
cout << "请输入链表A长度" << endl;
cin >> lengthA;
cout << "请输入链表B长度" << endl;
cin >> lengthB;
for (int i = 0; i < lengthA; i++)
{
int data;
cin >> data;
LinkList newnode = new Lnode{ data,NULL };
s->next = newnode;
s = s->next;
}
for (int i = 0; i < lengthB; i++)
{
int data;
cin >> data;
LinkList newnode = new Lnode{ data,NULL };
p->next = newnode;
p = p->next;
}
s = &a;
p = &b;
printLink(s);
printLink(p);
fun(s, p);
printLink(s);
}
第十六题 这题应该可以使用KMP算法 但是我忘了 先用暴力算法凑合做做吧
暴力算法本身也不具有太大难度 熟练之后应该还是挺简单的
#include<iostream>
#include<iomanip>
#include<string>
#include<fstream>
#include<cmath>
#include<vector>
#include<stack>
#include<cstdio>
#include<array>
#include<vector>
#include<map>
#include<queue>
using namespace std;
typedef struct Lnode
{
int data;
struct Lnode* next;
}Lnode, * LinkList;
void printLink(LinkList s) //带头节点输出
{
while (s->next != NULL)
{
s = s->next;
cout << left << setw(4) << s->data;
}
cout << endl;
}
void fun(LinkList s, LinkList p)
{
LinkList now1 = s->next;
LinkList temp = now1;
LinkList now2 = p->next;
if (now2 == nullptr)
{
return;
}
while (now1 != nullptr)
{
if (now2->data == now1->data)
{
temp = now1;
while (now1!=NULL&&now2!=NULL)
{
if (now1->data == now2->data)
{
now1 = now1->next;
now2 = now2->next;
continue;
}
else
{
now1 = temp->next;
now2 = p->next;
break;
}
}
if (now2 == NULL)
{
cout << "是对应的字串" << endl;
return;
}
else if(now1==NULL)
{
cout << "不是对应的字串"<< endl;
return;
}
}
else
{
now1 = now1->next;
}
}
if (now1 == NULL)
{
cout << "不是对应的字串" << endl;
}
}
int main()
{
cout << "请生成链表" << endl;
Lnode a = { -1,NULL }; //头结点
Lnode b = { -1,NULL }; //头结点
Lnode c = { -1,NULL }; //头结点
LinkList s = &a;
LinkList p = &b;
LinkList t = &c;
int lengthA, lengthB;
cout << "请输入链表A长度" << endl;
cin >> lengthA;
cout << "请输入链表B长度" << endl;
cin >> lengthB;
for (int i = 0; i < lengthA; i++)
{
int data;
cin >> data;
LinkList newnode = new Lnode{ data,NULL };
s->next = newnode;
s = s->next;
}
for (int i = 0; i < lengthB; i++)
{
int data;
cin >> data;
LinkList newnode = new Lnode{ data,NULL };
p->next = newnode;
p = p->next;
}
s = &a;
p = &b;
printLink(s);
printLink(p);
fun(s, p);
}
第十七题
#include<iostream>
#include<iomanip>
#include<string>
#include<fstream>
#include<cmath>
#include<vector>
#include<stack>
#include<cstdio>
#include<array>
#include<vector>
#include<map>
#include<queue>
using namespace std;
typedef struct Lnode
{
int data;
struct Lnode* next;
struct Lnode* prior;
}Lnode, * LinkList;
void printLink(LinkList s) //带头节点输出
{
LinkList now = s->next;
while (now != s)
{
cout <<left<<setw(4)<< now->data;
now = now->next;
}
cout << endl;
}
void fun(LinkList s)
{
LinkList up = s->prior;
LinkList down = s->next;
while (up->data == down->data)
{
up = up->prior;
down = down->next;
if (up == down)
{
cout << "是对称的" << endl;
return;
}
}
cout << "不对称" << endl;
}
int main()
{
cout << "请生成链表" << endl;
Lnode a = { -1,NULL,NULL }; //头结点
Lnode b = { -1,NULL,NULL }; //头结点
int LnodeLengthA;
cout << "输入链表长度" << endl;
cin >> LnodeLengthA;
LinkList A = &a;
for (int i = 0; i < LnodeLengthA; i++)
{
int data;
cin >> data;
LinkList newnode =new Lnode { data,NULL,NULL };
newnode->prior= A;
A->next = newnode;
A = newnode;
}
A->next = &a;
(&a)->prior = A;
A = &a;
printLink(A);
fun(A);
}
第十八题
#include<iostream>
#include<iomanip>
#include<string>
#include<fstream>
#include<cmath>
#include<vector>
#include<stack>
#include<cstdio>
#include<array>
#include<vector>
#include<map>
#include<queue>
using namespace std;
typedef struct Lnode
{
int data;
struct Lnode* next;
}Lnode, * LinkList;
void printLink(LinkList s) //带头节点输出
{
LinkList p = s;
while (p->next !=s)
{
p = p->next;
cout << left << setw(4) << p->data;
}
cout << endl;
}
void fun(LinkList s, LinkList p)
{
LinkList B = p;
LinkList A = s;
LinkList rearA;
LinkList rearB;
while (A->next != s)
{
A = A->next;
}
while (B->next != p)
{
B = B->next;
}
rearA = A; //表示链表s的最后一个节点
rearB = B; //表示链表p的最后一个节点
rearA->next = p->next;
rearB->next = s;
}
int main()
{
cout << "请生成链表" << endl;
Lnode a = { -1,NULL }; //头结点
Lnode b = { -1,NULL }; //头结点
Lnode c = { -1,NULL }; //头结点
LinkList s = &a;
LinkList p = &b;
LinkList t = &c;
int lengthA, lengthB;
cout << "请输入链表A长度" << endl;
cin >> lengthA;
cout << "请输入链表B长度" << endl;
cin >> lengthB;
for (int i = 0; i < lengthA; i++)
{
int data;
cin >> data;
LinkList newnode = new Lnode{ data,NULL };
s->next = newnode;
s = s->next;
}
for (int i = 0; i < lengthB; i++)
{
int data;
cin >> data;
LinkList newnode = new Lnode{ data,NULL };
p->next = newnode;
p = p->next;
}
s->next = &a;
p->next = &b;
s = &a;
p = &b;
printLink(s);
printLink(p);
fun(s, p);
printLink(s);
}
第十九题 首先这个free 不知道怎么就不能用了 然后重启之后又能用了 阿巴阿巴 神奇的vs 然后这个循环要注意一下 明明不是很难 写了半年
#include<iostream>
#include<iomanip>
#include<string>
#include<fstream>
#include<cmath>
#include<vector>
#include<stack>
#include<cstdio>
#include<array>
#include<vector>
#include<map>
#include<queue>
using namespace std;
typedef struct Lnode
{
int data;
struct Lnode* next;
}Lnode, * LinkList;
void printLink(LinkList s) //带头节点输出
{
LinkList p = s;
while (p->next !=s)
{
p = p->next;
cout << left << setw(4) << p->data;
}
cout << endl;
}
void fun(LinkList s)
{
LinkList p;
while (s->next !=s) //表示链表不为空
{
p = s->next;
int min = p->data;
LinkList minp=p;
LinkList minpriorp=s;
LinkList prior = s;
while (p!= s)//表示还没有一轮
{
if (min > p->data)
{
minp = p;
minpriorp = prior;
min = p->data;
}
prior = p;
p = p->next;
}
minpriorp->next = minp->next;
delete minp;
printLink(s);
}
delete s;
}
int main()
{
cout << "请生成链表" << endl;
LinkList A = new Lnode{-1,NULL};
LinkList s = A;
int lengthA, lengthB;
cout << "请输入链表A长度" << endl;
cin >> lengthA;
for (int i = 0; i < lengthA; i++)
{
int data;
cin >> data;
LinkList newnode = new Lnode{ data,NULL };
s->next = newnode;
s = s->next;
}
s->next = A;
printLink(A);
fun(A);
}
第二十题 需要考虑一些特殊情况 例如 检测到的节点在末尾 或者 检测节点位置和插入位置相同等等
#include<iostream>
#include<iomanip>
#include<string>
#include<fstream>
#include<cmath>
#include<vector>
#include<stack>
#include<cstdio>
#include<array>
#include<vector>
#include<map>
#include<queue>
using namespace std;
typedef struct Lnode
{
int data;
int num;
struct Lnode* next;
struct Lnode* prior;
}Lnode, *LinkList;
void printLink(LinkList s) //带头节点输出
{
LinkList p = s;
while (p->next !=NULL)
{
p = p->next;
cout << left << setw(4) << p->data;
}
cout << endl;
}
void fun(LinkList s,int xw)
{
//其实也就是访问 data为x的节点
LinkList p = s->next;
while (p!=nullptr&&p->data != xw)
{
p = p->next;
}
if (p == nullptr)
{
cout << "这个值在链表中不存在 亲";
return;
}
else //这个点就是我们要找的点
{
p->num++;//此行根据从左到右规则运算
LinkList newnum = s->next;
while (newnum->num > p->num)
{
newnum = newnum->next;
}
//退出 要么newnum是最后一个 要么是表示第一个频率等于或者小于p的节点
//当然也有可能就是p本身 显然如果newnum是最后一个 那么必然也就是p本身
//p应当插入newnum的前方
if (p != newnum)
{
p->prior->next = p->next; //从链表中暂时删除p
if (p->next != nullptr)
{
p->next->prior = p->prior;
}
p->prior = newnum->prior;
newnum->prior->next = p;
newnum->prior = p;
p->next = newnum;
}
}
}
int main()
{
cout << "请生成链表" << endl;
LinkList A = new Lnode{-1,0,NULL,NULL};
LinkList s = A;
int lengthA, lengthB;
cout << "请输入链表A长度" << endl;
cin >> lengthA;
for (int i = 0; i < lengthA; i++)
{
int data;
cin >> data;
LinkList newnode = new Lnode{ data,0,NULL,NULL };
s->next = newnode;
newnode->prior = s;
s = s->next;
}
//构建非循环双向链表
printLink(A);
for (int i = 0; i < 10; i++)
{
int data;
cin >> data;
fun(A, data);
printLink(A);
}
}
第二十一题 此题为2009真题 注意一下循环终止条件即可 不算难题
#include<iostream>
#include<iomanip>
#include<string>
#include<fstream>
#include<cmath>
#include<vector>
#include<stack>
#include<cstdio>
#include<array>
#include<vector>
#include<map>
#include<queue>
using namespace std;
typedef struct Lnode
{
int data;
struct Lnode* next;
}Lnode, *LinkList;
void printLink(LinkList s) //带头节点输出
{
LinkList p = s;
while (p->next !=NULL)
{
p = p->next;
cout << left << setw(4) << p->data;
}
cout << endl;
}
void fun(LinkList Head, int x)//功能函数
{
//通过设置第二个指针的方式可以解决这个问题
int num = -x;
LinkList Work=Head;
LinkList realNum=Head;
while (Work->next != nullptr)
{
Work = Work->next;
num++;
if (num >= 0)
{
realNum = realNum->next;
}
}
if (realNum == Head)
{
cout << "您给的值有点太大了亲" << endl;
}
else
{
cout << realNum->data;
}
}
int main()
{
cout << "请生成链表" << endl;
LinkList A = new Lnode{-1,NULL};
LinkList s = A;
int lengthA, lengthB;
cout << "请输入链表A长度" << endl;
cin >> lengthA;
for (int i = 0; i < lengthA; i++)
{
int data;
cin >> data;
LinkList newnode = new Lnode{ data,NULL };
s->next = newnode;
s = s->next;
}
//构建链表
printLink(A);
int num;
cin >> num;
fun(A, num);
}
第二十二题 此题为2012 408真题
这道题思想和第八题完全相同 此处不再赘述 只需要先获取两个链表长度然偶右对齐即可
等第二次复习再写吧
第二十三题 可使用辅助数组 这应该是最容易想到的 使用hash表也行 不过就需要知道怎么使用哈希表了 总而言之 哈希表的使用还是很简单的
#include<iostream>
#include<iomanip>
#include<string>
#include<fstream>
#include<cmath>
#include<vector>
#include<stack>
#include<cstdio>
#include<array>
#include<vector>
#include<map>
#include<queue>
using namespace std;
typedef struct Lnode
{
int data;
struct Lnode* next;
}Lnode, *LinkList;
void printLink(LinkList s) //带头节点输出
{
LinkList p = s;
while (p->next!=NULL)
{
p = p->next;
cout << left << setw(4) << p->data;
}
cout << endl;
}
void fun(LinkList Head)//功能函数
{
map<int, int> hashmap;
LinkList p = Head->next;
LinkList rear = Head;
while (p != nullptr)
{
if (hashmap[abs(p->data)] == 0) //震惊 这都行 保险也可以写 if(hashmap.find(abs(p->data))==hashmap.end())
{
hashmap[(abs(p->data))]++;
rear = p;
p = p->next;
}
else //表示这个节点应该要去世了
{
rear->next = p->next;
free(p);
p = rear->next;
}
}
}
int main()
{
cout << "请生成链表" << endl;
LinkList A = new Lnode{-1,NULL};
LinkList s = A;
int lengthA, lengthB;
cout << "请输入链表A长度" << endl;
cin >> lengthA;
for (int i = 0; i < lengthA; i++)
{
int data;
cin >> data;
LinkList newnode = new Lnode{ data,NULL };
s->next = newnode;
s = s->next;
}
//构建链表
printLink(A);
fun(A);
printLink(A);
}
第二十四题 这题。。我觉的和上面那个可以用同种办法解决 同样哈希表 不过测试用例比较难写就是了
不过这道题答案的方法也很巧妙 可以一试 如果要求空间复杂度为1 那么答案上这种还是很有可取之处的
#include<iostream>
#include<iomanip>
#include<string>
#include<fstream>
#include<cmath>
#include<vector>
#include<stack>
#include<cstdio>
#include<array>
#include<vector>
#include<map>
#include<queue>
using namespace std;
typedef struct Lnode
{
int data;
struct Lnode* next;
}Lnode, *LinkList;
void printLink(LinkList s) //带头节点输出
{
LinkList p = s;
while (p->next!=NULL)
{
p = p->next;
cout << left << setw(4) << p->data;
}
cout << endl;
}
void fun(LinkList Head)//功能函数
{
map<LinkList, int> hashmap;
LinkList p = Head->next;
LinkList rear = Head;
while (p != nullptr)
{
if (hashmap[p] == 0) //震惊 这都行 保险也可以写 if(hashmap.find(abs(p->data))==hashmap.end())
{
hashmap[p]++;
rear = p;
p = p->next;
}
else //表示兄弟这个节点不是第一次访问了
{
cout << "兄弟你不是第一次来这里了" << endl;
cout << p->data << endl;
return;
}
}
cout << "没有循环节点" << endl;
}
int main()
{
cout << "请生成链表" << endl;
LinkList A = new Lnode{-1,NULL};
LinkList B = new Lnode{ -1,NULL };
LinkList s = A;
LinkList t = B;
int lengthA, lengthB;
cout << "请输入链表A长度" << endl;
cin >> lengthA;
cout << "请输入链表B长度" << endl;
cin >> lengthB;
for (int i = 0; i < lengthA; i++)
{
int data;
cin >> data;
LinkList newnode = new Lnode{ data,NULL };
s->next = newnode;
s = s->next;
}
for (int i = 0; i < lengthB; i++)
{
int data;
cin >> data;
LinkList newnode = new Lnode{ data,NULL };
t->next = newnode;
t = t->next;
}
//构建链表
s->next = B->next;
t->next = s;
fun(A);
}
第二十五题 这题看起来不简单 是2019年真题
我写的递归方法比较复杂看不懂可以看下面答案的推荐方法
但两种方法都需要找到链表的中点位置
我最开始想到的就是递归 但是递归的话 不是很好操作 需要使用引用逐层返回插入点的插入位置
#include<iostream>
#include<iomanip>
#include<string>
#include<fstream>
#include<cmath>
#include<vector>
#include<stack>
#include<cstdio>
#include<array>
#include<vector>
#include<map>
#include<queue>
using namespace std;
typedef struct Lnode
{
int data;
struct Lnode* next;
}Lnode, * LinkList;
void printLink(LinkList s) //带头节点输出
{
LinkList p = s;
while (p->next != NULL)
{
p = p->next;
cout << left << setw(4) << p->data;
}
cout << endl;
}
void digui(LinkList head,LinkList& now1, LinkList now2)
{
if (now2->next != nullptr) //表示第二队列还没有到最后一个点处
{
LinkList temp = now2;
digui(head,now1, now2->next); //递归结束返回时
//假设其为倒数第二层 那么其原来的节点已经被删除
now2->next = now1->next;
now1->next = now2;
now1 = now1->next->next;
}
else
{
//已经是最后一个节点
now2->next = now1->next;
now1->next = now2;
now1 = now1->next->next;
}
printLink(head);
}
void fun(LinkList Head)//功能函数
{
LinkList n1 = Head;
LinkList n2 = Head;
if (Head->next == nullptr || Head->next->next == nullptr)
{
//表示链表为空或者只有一个元素
return;
}
while (n1!=nullptr&&n1->next != nullptr)
{
n1 = n1->next; //n1前进两步 n2前进一步
n1 = n1->next;
n2 = n2->next;
}
//此时n2指向的位置是前半部分的最后一个元素
LinkList temp = n2->next;
n2->next = NULL;
n1 = Head->next;
digui(Head,n1, temp);
}
int main()
{
cout << "请生成链表" << endl;
LinkList A = new Lnode{ -1,NULL };
LinkList s = A;
int lengthA, lengthB;
cout << "请输入链表A长度" << endl;
cin >> lengthA;
for (int i = 0; i < lengthA; i++)
{
int data;
cin >> data;
LinkList newnode = new Lnode{ data,NULL };
s->next = newnode;
s = s->next;
}
//构建链表
printLink(A);
fun(A);
printLink(A);
}
答案给的方法很巧妙
#include<iostream>
#include<iomanip>
#include<string>
#include<fstream>
#include<cmath>
#include<vector>
#include<stack>
#include<cstdio>
#include<array>
#include<vector>
#include<map>
#include<queue>
using namespace std;
typedef struct Lnode
{
int data;
struct Lnode* next;
}Lnode, * LinkList;
void printLink(LinkList s) //带头节点输出
{
LinkList p = s;
while (p->next != NULL)
{
p = p->next;
cout << left << setw(4) << p->data;
}
cout << endl;
}
void fun(LinkList Head)//功能函数
{
LinkList n1 = Head;
LinkList n2 = Head;
if (Head->next == nullptr || Head->next->next == nullptr)
{
//表示链表为空或者只有一个元素
return;
}
while (n1!=nullptr&&n1->next != nullptr)
{
n1 = n1->next; //n1前进两步 n2前进一步
n1 = n1->next;
n2 = n2->next;
}
//此时n2指向的位置是前半部分的最后一个元素
LinkList temp = n2->next;
n2->next = NULL;
while (temp != nullptr)
{
LinkList temp2 = temp->next;
temp->next = n2->next;
n2->next = temp;
temp = temp2;
}
//后半段逆置完成 n2的值并未发生变化
n1 = Head->next;
LinkList t = n2;
n2 = n2->next;
t->next = NULL;
while (n2 != nullptr)
{
LinkList temp = n2->next;
n2->next = n1->next;
n1->next = n2;
n2 = temp;
n1 = n1->next->next;
}
}
int main()
{
cout << "请生成链表" << endl;
LinkList A = new Lnode{ -1,NULL };
LinkList s = A;
int lengthA, lengthB;
cout << "请输入链表A长度" << endl;
cin >> lengthA;
for (int i = 0; i < lengthA; i++)
{
int data;
cin >> data;
LinkList newnode = new Lnode{ data,NULL };
s->next = newnode;
s = s->next;
}
//构建链表
printLink(A);
fun(A);
printLink(A);
}