链表
- 头文件
- 设计一个递归算法,删除不带头节点的单链表L中所有值为x的结点
- 删除带头节点单链表中所有值为x的结点
- 删除带头结点单链表中第一个值为x的结点
- 从尾到头反向输出每个单链表的值
- 编写一个算法让单链表就地逆置
- 从链表中删除给定值在s到t之间的所有元素(不包括s和t)
- 删除带头节点的单链表中最小值
- 删除不带头节点的单链表中最小的元素
- 给定一个单链表,按递增排序输出的单链表中各结点的数据元素,并释放节点所占空间
- 将一个带头节点的单链表A分解成两个带头节点的单链表A和B使A中含奇数位置元素,B中含偶数位置元素,且相对位置不变
- 将一个单链表{a1,b1,a2,b2……an,bn}拆分成{a1,a2,……,an}和{bn,bn-1,……,b1}
- 删除递增链表中重复的元素 并且保留这些重复的元素的其中一个
- 两个递增有序的单链表, 设计算法成一个非递减有序的链表
- 两个递增有序的单链表 设计算法成一个非递增有序的链表
- A, B两个单链表递增有序,从A,B中找出公共元素产生单链表C,要求不破环A,B结点
- A, B两个单链表递增有序,从A,B中找出公共元素并存放于A
- 两个序列分别为A、B,将其存放到链表中, 判断B是否是A的连续子序列
- 查找单链表中倒数第k个结点,若成功,则输出该节点的data,并返回1,否则返回0
- 用单链表保存m个整数,并且|data|≤n, 要求设计时间复杂度尽可能高效的算法 对于data绝对值相等的点,仅保留第―次出现的点
- 判断带头结点的循环双链表是否对称
- 有两个循环单链表,链表头指针分别为h1,h2,试编写函数将h2链表接到h1之后,要求链接后仍保持循环链表形式
- 设有一个带头结点的循环单链表,其结点值为正整数设计算法反复找出链表内最小值并不断输出,并将结点从链表中删除,直到链表为空,再删除表头结点
- 判断单链表是否有环
- 给定一个单链表L(a1,a2,a3,……,an)将其重新排列为(a1,an,a2,an-1,……)
头文件
#include <iostream>
using namespace std;
typedef struct LNode
{
int data;
struct LNode *next;
} LNode, *Linklist;
Linklist aaaa();
Linklist bbbb();
#include <iostream>
using namespace std;
typedef struct LNode
{
int data;
struct LNode *next;
} LNode, *Linklist;
Linklist dddd();
#pragma once
#include <iostream>
using namespace std;
typedef struct DNode
{
int data;
struct DNode *next, *prior;
} DNode, *Dinklist;
Dinklist cccc();
#include"linklist.h"
Linklist aaaa()
{
LNode *L = new LNode;
int a;
cin >> a;
L->data = a;
LNode *p = L;
cin >> a;
while (a != 0)
{
LNode *q = new LNode;
q->data = a;
q->next = NULL;
p->next = q;
p = p->next;
cin >> a;
}
p->next = NULL;
return L;
}
Linklist bbbb()
{
LNode *L = new LNode;
LNode *p = L;
int a;
cin >> a;
while (a != 0)
{
LNode *q = new LNode;
q->data = a;
q->next = NULL;
p->next = q;
p = p->next;
cin >> a;
}
p->next = NULL;
return L;
}
#include"circlesinglefun.h"
Linklist dddd()
{
LNode *L = new LNode;
LNode *p = L;
int a;
cin >> a;
while (a != 0)
{
LNode *q = new LNode;
q->data = a;
q->next = NULL;
p->next = q;
p = p->next;
cin >> a;
}
p->next = L;
return L;
}
#include"circledoublefun.h"
Dinklist cccc() {
DNode *L = new DNode;
DNode *p = L;
int a;
cin >> a;
while (a != 0)
{
DNode *q = new DNode;
q->data = a;
q->next = NULL;
q->prior = p;
p->next = q;
p = p->next;
cin >> a;
}
p->next = L;
L->prior = p;
return L;
}
设计一个递归算法,删除不带头节点的单链表L中所有值为x的结点
#include <iostream>
using namespace std;
#include"linklist.h"
void del_x(LNode *&L, int x)
{
LNode *p;
if (L == NULL) return;
if (L->data == x)
{
p = L;
L = L->next;
free(p);
del_x(L, x);
}
else
del_x(L->next, x);
}
int main01()
{
LNode *L = aaaa();
del_x(L, 2);
while (L != NULL)
{
cout << L->data << " ";
L = L->next;
}
return EXIT_SUCCESS;
}
删除带头节点单链表中所有值为x的结点
#include <iostream>
using namespace std;
#include"linklist.h"
void del(LNode *&L, int x)
{
LNode *p = L->next, *pre = L;
LNode *q;
while (p != NULL)
{
if (p->data == x)
{
q = p;
pre->next = p->next;
p = p->next;
free(q);
}
else
{
pre = p;
p = p->next;
}
}
}
void Del(LNode *&L, int x)
{
LNode *p = L;
while (p->next != NULL)
{
if (p->next->data == x)
{
LNode *q = p->next;
p->next = q->next;
free(q);
}
else
p = p->next;
}
}
int main02()
{
LNode *L = bbbb();
Del(L, 4);
LNode *q = L->next;
while (q != NULL)
{
cout << q->data << " ";
q = q->next;
}
return EXIT_SUCCESS;
}
删除带头结点单链表中第一个值为x的结点
#include <iostream>
#include "linklist.h"
using namespace std;
int finddelete(LNode *&C, int x)
{
LNode *p, *q;
p = C;
while (p->next != NULL)
{
if (p->next->data == x)
break;
else
p = p->next;
}
if (p->next == NULL)
return 0;
else
{
q = p->next;
p->next = q->next;
free(q);
return 1;
}
}
void finddelete2(LNode *&C, int x)
{
LNode *p, *q;
p = C;
while (p->next != NULL)
{
if (p->next->data == x)
{
q = p->next;
p->next = q->next;
free(q);
return;
}
else
p = p->next;
}
return;
}
int main03()
{
LNode *L = bbbb();
finddelete2(L, 2);
LNode *q = L->next;
while (q != NULL)
{
cout << q->data << " ";
q = q->next;
}
return 0;
}
从尾到头反向输出每个单链表的值
#include <iostream>
#include "linklist.h"
using namespace std;
void print(LNode *L)
{
if (L->next != NULL)
{
print(L->next);
}
cout << L->data << " ";
}
int main04()
{
LNode *L = bbbb();
print(L->next);
return EXIT_SUCCESS;
}
编写一个算法让单链表就地逆置
#include <iostream>
#include "linklist.h"
using namespace std;
void reverse(LNode *&L)
{
LNode *p = L->next, *r;
L->next = NULL;
while (p != NULL)
{
r = p->next;
p->next = L->next;
L->next = p;
p = r;
}
}
void Reverse(LNode *&L)
{
LNode *p = L->next, *r = p->next;
LNode *pre;
p->next = NULL;
while (r != NULL)
{
pre = p;
p = r;
r = r->next;
p->next = pre;
}
L->next = p;
}
int main05()
{
LNode *L = bbbb();
reverse(L);
LNode *q = L->next;
while (q != NULL)
{
cout << q->data << " ";
q = q->next;
}
return 0;
}
从链表中删除给定值在s到t之间的所有元素(不包括s和t)
#include <iostream>
#include "linklist.h"
using namespace std;
void del(LNode *&L, int min, int max)
{
LNode *p = L;
while (p->next != NULL)
{
if (p->next->data > min && p->next->data < max)
{
LNode *u = p->next;
p->next = u->next;
free(u);
}
else
p = p->next;
}
}
int main06()
{
LNode *L = bbbb();
del(L, 5, 10);
LNode *q = L->next;
while (q != NULL)
{
cout << q->data << " ";
q = q->next;
}
return EXIT_SUCCESS;
}
删除带头节点的单链表中最小值
#include <iostream>
#include "linklist.h"
using namespace std;
void del_min2(LNode *&L)
{
LNode *p = L;
LNode *minp = L;
while (p->next != NULL)
{
if (p->next->data < minp->next->data)
minp = p;
p = p->next;
}
LNode *u = minp->next;
minp->next = u->next;
free(u);
}
int main07()
{
LNode *L = bbbb();
del_min2(L);
LNode *q = L->next;
while (q != NULL)
{
cout << q->data << " ";
q = q->next;
}
return 0;
}
删除不带头节点的单链表中最小的元素
#include <iostream>
#include"linklist.h"
using namespace std;
void del_min(LNode *&L)
{
LNode *minp = L;
LNode *p = L->next;
while (p != NULL)
{
if (p->data < minp->data)
minp = p;
p = p->next;
}
if (L == minp)
{
L = L->next;
free(minp);
return;
}
p = L;
while (p->next != minp)
p = p->next;
p->next = minp->next;
free(minp);
}
int main08()
{
LNode *L = aaaa();
del_min(L);
LNode *q = L;
while (q != NULL)
{
cout << q->data << " ";
q = q->next;
}
return 0;
}
给定一个单链表,按递增排序输出的单链表中各结点的数据元素,并释放节点所占空间
#include <iostream>
#include "linklist.h"
using namespace std;
void del_min10086(LNode *&head)
{
while (head->next != NULL)
{
LNode *pre = head;
LNode *p = head->next;
while (p->next != NULL)
{
if (p->next->data < pre->next->data)
{
pre = p;
}
p = p->next;
}
cout << pre->next->data << " ";
LNode *u = pre->next;
pre->next = u->next;
free(u);
}
free(head);
}
int main09()
{
LNode *L = bbbb();
del_min10086(L);
return EXIT_SUCCESS;
}
将一个带头节点的单链表A分解成两个带头节点的单链表A和B使A中含奇数位置元素,B中含偶数位置元素,且相对位置不变
#include<iostream>
using namespace std;
#include"linklist.h"
Linklist create1(LNode *&A)
{
LNode *B = new LNode;
B->next = NULL;
LNode *ra = A, *rb = B, *p = A->next;
A->next = NULL;
while (p != NULL)
{
ra->next = p;
ra = p;
p = p->next;
rb->next = p;
rb = p;
if (p != NULL)
p = p->next;
}
ra->next = NULL;
return B;
}
int main10()
{
LNode *A = bbbb();
LNode *B = create1(A);
LNode *q = A->next;
LNode *p = B->next;
cout << "A: ";
while (q != NULL)
{
cout << q->data << " ";
q = q->next;
}
cout << endl;
cout << "B: ";
while (p != NULL)
{
cout << p->data << " ";
p = p->next;
}
return EXIT_SUCCESS;
}
将一个单链表{a1,b1,a2,b2……an,bn}拆分成{a1,a2,……,an}和{bn,bn-1,……,b1}
#include <iostream>
#include "linklist.h"
using namespace std;
Linklist create(LNode *&A)
{
LNode *B = new LNode;
B->next = NULL;
LNode *ra = A, *p = A->next, *q;
A->next = NULL;
while (p != NULL)
{
ra->next = p;
ra = p;
p = p->next;
q = p;
if (q == NULL)
break;
p = p->next;
q->next = B->next;
B->next = q;
}
ra->next = NULL;
return B;
}
int main11()
{
LNode *A = bbbb();
LNode *B = create(A);
LNode *q = A->next;
LNode *p = B->next;
cout << "A ";
while (q != NULL)
{
cout << q->data << " ";
q = q->next;
}
cout << "B ";
while (p != NULL)
{
cout << p->data << " ";
p = p->next;
}
return 0;
}
删除递增链表中重复的元素 并且保留这些重复的元素的其中一个
#include <iostream>
#include "linklist.h"
using namespace std;
void del111(LNode *&L)
{
LNode *p = L->next;
if (p == NULL)
return;
while (p->next != NULL)
{
LNode* q = p->next;
if (p->data == q->data)
{
p->next = q->next;
free(q);
}
else
p = p->next;
}
}
int main12()
{
LNode *A = bbbb();
del111(A);
LNode *q = A->next;
cout << "A ";
while (q != NULL)
{
cout << q->data << " ";
q = q->next;
}
return EXIT_SUCCESS;
}
两个递增有序的单链表, 设计算法成一个非递减有序的链表
#include <iostream>
#include "linklist.h"
using namespace std;
void fun10(LNode *&A, LNode *&B)
{
LNode *p = A->next, *q = B->next;
LNode *ra = A;
A->next = NULL;
B->next = NULL;
while (p != NULL && q != NULL)
{
if (p->data <= q->data)
{
ra->next = p;
p = p->next;
ra = ra->next;
}
else
{
ra->next = q;
q = q->next;
ra = ra->next;
}
}
if (p != NULL)
ra->next = p;
if (q != NULL)
ra->next = q;
}
int main13()
{
cout << "A:";
LNode *A = bbbb();
cout << "B:";
LNode *B = bbbb();
fun10(A, B);
LNode *q = A->next;
cout << "A+B:";
while (q != NULL)
{
cout << q->data << " ";
q = q->next;
}
return EXIT_SUCCESS;
}
两个递增有序的单链表 设计算法成一个非递增有序的链表
#include <iostream>
#include "linklist.h"
using namespace std;
void fun23(LNode *&A, LNode *&B)
{
LNode *p = A->next, *q = B->next, *s;
A->next = NULL;
B->next = NULL;
while (p != NULL && q != NULL)
{
if (p->data <= q->data)
{
s = p;
p = p->next;
s->next = A->next;
A->next = s;
}
else
{
s = q;
q = q->next;
s->next = A->next;
A->next = s;
}
}
while (p != NULL)
{
s = p;
p = p->next;
s->next = A->next;
A->next = s;
}
while (q != NULL)
{
s = q;
q = q->next;
s->next = A->next;
A->next = s;
}
}
int main14()
{
cout << "A:";
LNode *A = bbbb();
cout << "B:";
LNode *B = bbbb();
fun23(A, B);
LNode *q = A->next;
cout << "A:";
while (q != NULL)
{
cout << q->data << " ";
q = q->next;
}
return 0;
}
A, B两个单链表递增有序,从A,B中找出公共元素产生单链表C,要求不破环A,B结点
#include <iostream>
#include "linklist.h"
using namespace std;
Linklist common(LNode *A, LNode *B)
{
LNode *p = A->next;
LNode *q = B->next;
LNode *C = new LNode;
LNode *r = C;
while (p != NULL && q != NULL)
{
if (p->data < q->data)
p = p->next;
else if (p->data > q->data)
q = q->next;
else
{
LNode* s = new LNode;
s->data = p->data;
r->next = s;
r = s;
p = p->next;
q = q->next;
}
}
r->next = NULL;
return C;
}
int main15()
{
cout << "A:";
LNode *A = bbbb();
cout << "B:";
LNode *B = bbbb();
LNode *C = common(A, B);
LNode *q = C->next;
while (q != NULL)
{
cout << q->data << " ";
q = q->next;
}
return 0;
}
A, B两个单链表递增有序,从A,B中找出公共元素并存放于A
#include <iostream>
#include "linklist.h"
using namespace std;
void Union(LNode *&A, LNode *&B)
{
LNode *p = A->next;
LNode *q = B->next;
LNode *ra = A, *u;
while (p != NULL && q != NULL)
{
if (p->data < q->data)
{
u = p;
p = p->next;
free(u);
}
else if (p->data > q->data)
{
u = q;
q = q->next;
free(u);
}
else
{
ra->next = p;
ra = p;
p = p->next;
u = q;
q = q->next;
free(u);
}
}
while (p != NULL)
{
u = p;
p = p->next;
free(u);
}
while (q != NULL)
{
u = q;
q = q->next;
free(u);
}
ra->next = NULL;
free(q);
}
int main16()
{
cout << "A:";
LNode *A = bbbb();
cout << "B:";
LNode *B = bbbb();
Union(A, B);
LNode *q = A->next;
while (q != NULL)
{
cout << q->data << " ";
q = q->next;
}
return 0;
}
两个序列分别为A、B,将其存放到链表中, 判断B是否是A的连续子序列
#include <iostream>
#include "linklist.h"
using namespace std;
int seq(LNode *A, LNode *B)
{
LNode *p = A->next;
LNode *pre = p;
LNode *q = B->next;
while (p != NULL && q != NULL)
{
if (p->data == q->data)
{
p = p->next;
q = q->next;
}
else
{
pre = pre->next;
p = pre;
q = B->next;
}
}
if (q == NULL)
return 1;
else
return 0;
}
int main17()
{
cout << "A:";
LNode *A = bbbb();
cout << "B:";
LNode *B = bbbb();
cout << "A:" << seq(A, B);
return 0;
}
查找单链表中倒数第k个结点,若成功,则输出该节点的data,并返回1,否则返回0
#include <iostream>
#include "linklist.h"
using namespace std;
int find(LNode *head, int k)
{
LNode *q = head->next;
LNode *p = head;
int i = 1;
while (q->next != NULL)
{
q = q->next;
++i;
}
while (i >= k) {
p = p->next;
--i;
}
if (p == head)
return 0;
else
{
cout << "倒数第3个节点为:" << p->data << endl;
return 1;
}
}
int len(LNode *L)
{
LNode *p = L->next;
int n = 0;
while (p != NULL)
{
p = p->next;
++n;
}
cout << "n=" << n << endl;
}
int Find(LNode *L, int k)
{
int i = 0, m;
m = len(L) - k + 1;
if (m <= 0)
{
return 0;
}
while (i < m)
{
L = L->next;
++i;
}
cout << L->data;
return 1;
}
int main()
{
LNode *L = bbbb();
int j = find(L, 3);
cout << "j=" << j << endl;
return 0;
}
用单链表保存m个整数,并且|data|≤n, 要求设计时间复杂度尽可能高效的算法 对于data绝对值相等的点,仅保留第―次出现的点
#include <iostream>
#include "linklist.h"
using namespace std;
void fun(LNode *&head, int n)
{
LNode *p = head;
LNode *r;
int *q = new int[n + 1];
int m;
for (int i = 0; i < n + 1; ++i)
q[i] = 0;
while (p->next != NULL)
{
if (p->next->data > 0)
m = p->next->data;
else
m = -p->next->data;
if (q[m] == 0)
{
q[m] = 1;
p = p->next;
}
else
{
r = p->next;
p->next = r->next;
free(r);
}
}
free(q);
}
int main19()
{
LNode *L = bbbb();
fun(L, 50);
L = L->next;
while (L != NULL)
{
cout << L->data << " ";
L = L->next;
}
return EXIT_SUCCESS;
}
判断带头结点的循环双链表是否对称
#include <iostream>
#include "circledoublefun.h"
using namespace std;
int fun(DNode *L)
{
DNode *p = L->next;
DNode *q = L->prior;
while (p != q && q->next != p)
if (p->data == q->data)
{
p = p->next;
q = q->prior;
}
else
return 0;
return 1;
}
int main20()
{
DNode *A = cccc();
cout << fun(A) << endl;
return 0;
}
有两个循环单链表,链表头指针分别为h1,h2,试编写函数将h2链表接到h1之后,要求链接后仍保持循环链表形式
#include <iostream>
#include "circlesinglefun.h"
using namespace std;
void link(LNode *&h1, LNode *&h2)
{
LNode *p, *q;
p = h1, q = h2;
while (p->next != h1)
p = p->next;
while (q->next != h2)
q = q->next;
p->next = h2;
q->next = h1;
}
int main21()
{
LNode *A = dddd();
LNode *B = dddd();
link(A, B);
LNode *q = A->next;
while (q != A)
{
cout << q->data << " ";
q = q->next;
}
return 0;
}
设有一个带头结点的循环单链表,其结点值为正整数设计算法反复找出链表内最小值并不断输出,并将结点从链表中删除,直到链表为空,再删除表头结点
#include <iostream>
#include "circlesinglefun.h"
using namespace std;
void del(LNode *&L)
{
LNode *p, *minp, *u;
while (L->next != L)
{
p = L->next;
minp = L;
while (p->next != L)
{
if (p->next->data < minp->next->data)
minp = p;
p = p->next;
}
cout << "依次输出为:";
cout << minp->next->data << endl;
u = minp->next;
minp->next = u->next;
free(u);
}
free(L);
}
int main22()
{
cout << "输入A链表:";
LNode *A = dddd();
del(A);
return 0;
}
判断单链表是否有环
#include <iostream>
#include "linklist.h"
using namespace std;
int findloop(LNode *L)
{
LNode *fast = L, *slow = L;
while (fast != NULL && fast->next != NULL)
{
slow = slow->next;
fast = fast->next->next;
if (slow == fast)
return 1;
}
return 0;
}
int main23()
{
LNode *L = bbbb();
cout << "A:" << findloop(L);
return 0;
}
给定一个单链表L(a1,a2,a3,……,an)将其重新排列为(a1,an,a2,an-1,……)
#include <iostream>
#include "linklist.h"
using namespace std;
Linklist divrev(LNode *&L)
{
LNode *p = L, *q = L;
while (q != NULL && q->next != NULL)
{
p = p->next;
q = q->next->next;
}
LNode *L1 = new LNode;
L1->next = p->next;
p->next = NULL;
LNode *p1 = L1->next, *r;
L1->next = NULL;
while (p1 != NULL)
{
r = p1->next;
p1->next = L1->next;
L1->next = p1;
p1 = r;
}
return L1;
}
void merge(LNode *&L)
{
LNode *r, *s;
LNode *L1 = divrev(L);
LNode *p = L->next, *q = L1->next;
L1->next = NULL;
while (q != NULL)
{
r = p->next;
s = q->next;
p->next = q;
q->next = r;
p = r;
q = s;
}
}
int main24()
{
LNode *L = bbbb();
merge(L);
L = L->next;
while (L != NULL)
{
cout << L->data << " ";
L = L->next;
}
return 0;
}