1.回文字符串
判断一个非空字符串是否是回文。
#include <iostream>
#include <string>
using namespace std;bool judge(string str) {int len = 0;for (int i = 0; i < 100; i++) {if (str[i] < 65 || str[i]>122) {break;}len++;//计算字符串的大小}for (int i = 0; i < len; i++) {if (str[i] != str[len - i - 1]) {return false;}//回文数/*此处将反面作为判断,因为正面必须所有字符都满足才可以,稍微麻烦*/}return true;
}
int main()
{string s;getline(cin, s);bool res = judge(s);if (res)cout << "YES" << endl;elsecout << "NO" << endl;return 0;
}
2.奇偶数排序
已知数组A[n]中的元素是整型,设计算法将其调整为左右两部分,其中左边是奇数,右边是偶数。并要求算法的时间复杂度是O(n),空间复杂度是O(1)。
#include <iostream>
using namespace std;
void split(int A[], int n) {int temp;int i=0, j=n-1;while (i < j) { while (i < j && A[i] % 2 != 0) i++;while (i < j && A[j] % 2 == 0) j--;if (i<j) {temp = A[i];A[i] = A[j];A[j] = temp;}}
}
void show(int A[], int n) {for (int i = 0; i < n; ++i)cout << A[i] << " ";cout << endl;
}
int main()
{int n;cin >> n;int a[100];for (int i = 0; i < n; ++i)cin >> a[i];split(a, n);show(a, n);return 0;
}
3.循环左移
将一个具有 n 个元素的数组A[n]向左循环移动k个位置,要求时间复杂度为O(n),空间复杂度为O(1)。
#include <iostream>
using namespace std;
void reverseArr(int A[], int start, int rear) {//倒置算法int temp;int len = rear - start + 1;for (int i = 0; i < len / 2; i++){temp = A[start + i];A[start + i] = A[rear - i];A[rear - i] = temp;}
}
void leftCir(int A[], int n, int k) {if (k <= 0 || k >= n)cout << "ERROR" << endl;else {/*将这个问题看作是把数组AB转换成数组BA(A代表数组的前 i 个元素,B代表数组中余下的 n – i 个元素),先将A置逆得到A',再将B置逆得到B',最后将整个A'B'置逆得到(A'B')' = BA*/reverseArr(A, 0, k - 1);reverseArr(A, k, n - 1);reverseArr(A, 0, n - 1);}
}
void show(int A[], int n) {for (int i = 0; i < n; ++i)cout << A[i] << " ";cout << endl;
}
int main()
{int n, p;cin >> n >> p;int a[100];for (int i = 0; i < n; ++i)cin >> a[i];leftCir(a, n, p);show(a, n);return 0;
}
4.求最大值与次最大值
找出整型数组A[n]中的最大值和次最大值
#include <iostream>using namespace std;
void getMax(int A[],int n,int &fMax,int &sMax){int temp;for (int i = 0; i < n; i++){for (int j = 0; j < n - 1; j++){if (A[j] < A[j + 1]) {temp = A[j];A[j] = A[j + 1];A[j + 1] = temp;}}}fMax = A[0];sMax = A[1];
}
int main()
{int n,maxV,nMax;cin>>n;int a[n];for(int i=0;i<n;++i)cin>>a[i];getMax(a,n,maxV,nMax);cout<<maxV<<" "<<nMax<<endl;return 0;
}
5.顺序表插入并且递增有序
已知顺序表L中的元素递增有序排列,设计算法将元素x插入到表L中并保持表L仍递增有序。
#include <iostream>
using namespace std;const int MaxSize = 100;
typedef int DataType;
DataType data[MaxSize];
int length = 0;void insertList(DataType elem)
{DataType data[MaxSize];int i;for (i = 0; i < length; i++){if (data[i] > elem)break;}for (int j = length - 1; j >= i; j--) {data[j + 1] = data[j];}data[i] = elem;length++;
}
void show()
{DataType data[MaxSize];for (int i = 0; i < length; ++i)cout << data[i] << " ";cout << endl;
}
int main()
{DataType data[MaxSize];cin >> length;for (int i = 0; i < length; ++i)cin >> data[i];DataType x;cin >> x;insertList(x);show();return 0;
}
6.删除顺序表元素
在顺序表中删除所有元素值为x的元素,要求空间复杂度为O(1)。
#include <iostream>
using namespace std;
const int MaxSize = 100;
typedef int DataType;
DataType data[MaxSize];
int length;void deleteList(DataType elem)
{DataType data[MaxSize];int acount = 0;int i, j;for (i = 0; i < length; i++) {if (data[i] == elem) {for (j = i; j < length; j++) {data[j] = data[j + 1];}acount++;i--;}}length = length - acount;
}
void show()
{DataType data[MaxSize];for (int i = 0; i < length; ++i)cout << data[i] << " ";cout << endl;
}
int main()
{DataType data[MaxSize];cin >> length;for (int i = 0; i < length; ++i)cin >> data[i];DataType x;cin >> x;deleteList(x);show();return 0;
}
7.顺序表逆置
以顺序表存储非空线性表,编写一个实现线性表就地逆置的算法。空间复杂度均是O(1)。
#include <iostream>
using namespace std;const int MaxSize = 100;
typedef int DataType;
DataType data[MaxSize];
int length;void reverseList()
{DataType data[MaxSize];int temp;for (int i = 0; i < length / 2; i++) {temp = data[i];data[i] = data[length - 1 - i];data[length - 1 - i] = temp;}
}
void show()
{DataType data[MaxSize];for (int i = 0; i < length; ++i)cout << data[i] << " ";cout << endl;
}
int main()
{DataType data[MaxSize];cin >> length;for (int i = 0; i < length; ++i)cin >> data[i];reverseList();show();return 0;
}
8.单链表逆置
以单链表作存储结构存储非空线性表,编写一个实现线性表就地逆置的算法。空间复杂度均是O(1)。
#include <iostream>
using namespace std;typedef int DataType;
typedef struct node {DataType data;node* next;
}node;
node* first;
int length;void init()
{first = new node;first->next = NULL;node* rear = first;cin >> length;for (int i = 0; i < length; ++i) {DataType elem;cin >> elem;node* s = new node;s->data = elem;s->next = NULL;rear->next = s;rear = s;}
}
void reverseList()
{node* q = new node();node* p = first->next;first->next = NULL;while (p != NULL){q = p->next;p->next = first->next;first->next = p;p = q;}}
void show()
{node* p = first->next;while (p != NULL) {cout << p->data << " ";p = p->next;}cout << endl;
}
int main()
{init();reverseList();show();return 0;
}
9.单链表删除重复数值
有一个递增非空单链表,设计一个算法删除值域重复的结点。例如{1,1,2,3,3,3,4,4,7,7,7,9,9,9,},经过删除后变成{1,2,3,4,7,9}。
#include <iostream>
using namespace std;template <class DataType>
struct node {DataType data;node<DataType>* next;
};template <class DataType>
class linkList {
public:linkList();~linkList();void Delete();void show();
private:node<DataType>* first;
};template <class DataType>
linkList<DataType>::linkList()
{first = new node<DataType>;first->next = NULL;node<DataType>* rear = first;int n;cin >> n;for (int i = 0; i < n; ++i) {DataType elem;cin >> elem;node<DataType>* s = new node<DataType>;s->data = elem;s->next = NULL;rear->next = s;rear = s;}
}
template <class DataType>
linkList<DataType>::~linkList()
{node<DataType>* p;while (first != NULL) {p = first;first = first->next;delete p;}
}
template <class DataType>
void linkList<DataType>::Delete()
{node<DataType>* p = first->next;while (p != NULL && p->next != NULL)//遍历链表,查看是否有与p值域相同的结点{if (p->data == p->next->data)//有,删除s{node<DataType>* s = p->next;//生成新结点s,指向重复结点p->next = s->next;//修改指针,此时q->next是s的下一个结点,下一轮继续判断delete s;}else//不同,判断下一个结点p = p->next;}
}template <class DataType>
void linkList<DataType>::show()
{node<DataType>* p = first->next;if (p == NULL) cout << "Empty";else {while (p != NULL) {cout << p->data << " ";p = p->next;}cout << endl;}
}
int main()
{linkList<int> L;L.Delete();L.show();L.~linkList();return 0;
}
10.查找单链表倒数第k个结点
【问题描述】输入一个单向链表,输出该链表中倒数第k个结点,链表的最后一个结点是倒数第1个节点。
【输入形式】第一行是数据的个数,第二行是空格分割的整型值,第三行是K值。
【输出形式】输出为倒数第K个结点的值,若无,则输出Not Found。
【样例输入】
8
13 45 54 32 1 4 98 2
3
【样例输出】4
【样例说明】K值为3,则输出链表倒数第3个结点的值,为4;数据输入间以空格隔开
#include <iostream>
using namespace std;template <class DataType>
struct node {DataType data;node<DataType>* next;
};template <class DataType>
class linkList {
public:linkList();~linkList();node<DataType>* reverseFindK(int k);
private:node<DataType>* first;
};template <class DataType>
linkList<DataType>::linkList()
{first = new node<DataType>;first->next = NULL;node<DataType>* rear = first;int n;cin >> n;for (int i = 0; i < n; ++i) {DataType elem;cin >> elem;node<DataType>* s = new node<DataType>;s->data = elem;s->next = NULL;rear->next = s;rear = s;}
}
template <class DataType>
linkList<DataType>::~linkList()
{node<DataType>* p;while (first != NULL) {p = first;first = first->next;delete p;}
}template <class DataType>
node<DataType>* linkList<DataType>::reverseFindK(int k)
{node<DataType>* p = NULL;node<DataType>* q = NULL;p = first->next;q = first->next;int count = 1;int length = 1;while (q != NULL) {q = q->next;length++;}while (p != NULL) {if (length < k) return NULL;if (count == length - k) {return p;}p = p->next;count++;}
}
int main()
{linkList<int> L;int k;cin >> k;node<int>* p = L.reverseFindK(k);if (p == NULL)cout << "Not Found" << endl;elsecout << p->data << endl;L.~linkList();return 0;
}
11.逆序打印单链表
写一个函数,逆序打印单链表中的数据(单链表是带有头结点的单链表)。
#include <iostream>
using namespace std;template <class DataType>
struct node {DataType data;node<DataType>* next;
};template <class DataType>
class linkList {
public:linkList();~linkList();node<DataType>* getFirst();void reversePrint(node<DataType>* p);
private:node<DataType>* first;
};template <class DataType>
linkList<DataType>::linkList()
{first = new node<DataType>;first->next = NULL;node<DataType>* rear = first;int n;cin >> n;for (int i = 0; i < n; ++i) {DataType elem;cin >> elem;node<DataType>* s = new node<DataType>;s->data = elem;s->next = NULL;rear->next = s;rear = s;}
}
template <class DataType>
linkList<DataType>::~linkList()
{node<DataType>* p;while (first != NULL) {p = first;first = first->next;delete p;}
}template <class DataType>
node<DataType>* linkList<DataType>::getFirst()
{return first;
}template <class DataType>
void linkList<DataType>::reversePrint(node<DataType>* p)
{if (p != NULL) {reversePrint(p->next);cout << p->data << " ";}}
int main()
{linkList<int> L;node<int>* p = L.getFirst()->next;if (p == NULL)cout << "Empty" << endl;elseL.reversePrint(p);L.~linkList();return 0;
}
12.删除单链表中大于minK且小于maxK的元素
已知单链表中各结点的元素值为整型且自增有序,设计算法删除单链表中大于minK且小于maxK的所有元素,并释放被删结点的存储空间。
#include <iostream>
using namespace std;typedef int DataType;
typedef struct node {DataType data;node* next;
}node;
node* first;void init()
{first = new node;first->next = NULL;node* rear = first;int length;cin >> length;for (int i = 0; i < length; ++i) {DataType elem;cin >> elem;node* s = new node;s->data = elem;s->next = NULL;rear->next = s;rear = s;}
}
void deleteList(DataType minK, DataType maxk)
{node* p = first;node* q = first->next;while (q != NULL){if (q->data > minK && q->data < maxk){p->next = q->next;delete q;q = p->next;}else{p = p->next;q = p->next;}}
}
void show()
{node* p = first->next;if (p == NULL) cout << "Empty";while (p != NULL) {cout << p->data << " ";p = p->next;}cout << endl;
}
int main()
{init();DataType minK, maxK;cin >> minK >> maxK;deleteList(minK, maxK);show();return 0;
}
13.双循环链表是否对称
判断带头结点的双循环链表是否对称。
#include <iostream>
using namespace std;typedef int DataType;
typedef struct node{DataType data;node* next,*prior;
}node;
node* first;void init( )
{first = new node;first->next = NULL;first->prior = NULL;node* rear = first;DataType elem;while(cin>>elem){node* s = new node;s->data = elem;s->next = NULL;s->prior = rear;rear->next = s;rear = s;}rear->next = first;first->prior = rear;
}
bool equalDulList()
{node* p = first->next;node* q = first->prior;while (p != q && p->prior != q) {if (p->data == q->data){p = p->next;q = q->prior;return true;}else{return false;}}return true;
}
void show()
{node* p = first->next;while(p != first){cout<<p->data<<" ";p = p->next;}cout<<endl;
}
int main()
{init();//show();bool res = equalDulList();if(res) cout<<"YES"<<endl;else cout<<"NO"<<endl;return 0;
}
14.单链表应用:八进制求和
假设用不带头结点的单链表表示八进制数,例如八进制数536表示成如图所示单链表。要求写一个函数Add,该函数有两个参数A和B,分别指向表示八进制的单链表,执行函数调用Add(A,B)后,得到表示八进制A加八进制B所得结果的单链表,结果保留在单链表A中。
【输入说明】A表的长度和A表中八进制的数码;(中间用空格隔开)
B表的长度和B表中八进制的数码;(中间用空格隔开)
【输出说明】八进制A加八进制B所得结果
3
5 3 6
2
5 4
【输出样例】
612
#include <iostream>
using namespace std;typedef int DataType;
typedef struct node {DataType data;node* next;
}node;//尾插法构造单链表
void init(node*& first, int len)
{first = NULL;node* rear;for (int i = 0; i < len; ++i) {DataType elem;cin >> elem;node* s = new node;s->data = elem;s->next = NULL;if (first == NULL) {first = s;rear = first;}else {rear->next = s;rear = s;}}
}
//八进制A加八进制B,结果存在链表A中
void add(node* A, node* B)
{node* p = A, * q = B;int flag = 0;//int sum = 0;while (p->next != NULL && q->next != NULL) {sum = p->data + q->data + flag;p->data = sum % 8;flag = sum / 8;p = p->next;q = q->next;}//A、B等长if (p->next == NULL && q->next == NULL) {sum = p->data + q->data + flag;p->data = sum % 8;flag = sum / 8;if (flag == 1) {node* s = new node;s->data = flag;s->next = NULL;p->next = s;}}//A比B短if (p->next == NULL && q->next != NULL) {sum = p->data + q->data + flag;//将A中的最后一个结点元素和B中同位置的元素相加后对8取余,并将余数放入A中的最后一个结点的数据域。p->data = sum % 8;//记录好此时p、q所分别指向的结点元素相加后是否有进位。flag = sum / 8;while (q->next != NULL) {node* s = new node;sum = q->next->data + flag;s->data = sum % 8;flag = sum / 8;s->next = NULL;p->next = s;p = p->next;q = q->next;}if (flag == 1 && q->next == NULL) {node* s = new node;s->data = flag;s->next = NULL;p->next = s;}}//A比B长if (q->next == NULL && p->next != NULL) {sum = p->data + q->data + flag;p->data = sum % 8;flag = sum / 8;while (p->next != NULL) {if (flag == 1) {sum = p->next->data + flag;p->next->data = sum % 8;flag = sum / 8;p = p->next;}elsebreak;}if (flag == 1 && p->next == NULL) {node* s = new node;s->data = flag;s->next = NULL;p->next = s;}}
}
void reverseList(node*& first)
{node* q = first, * p = first;if (first == NULL) {return;}else {while (p->next != NULL) {p = p->next;}first = p;p = q->next;while (q != first) {q->next = first->next;first->next = q;q = p;p = p->next;}}}
void show(node* first)
{node* p = first;if (p == NULL) cout << "Empty";else {while (p != NULL) {cout << p->data;p = p->next;}cout << endl;}
}
int main()
{node* A, * B;int aLen, bLen;cin >> aLen;init(A, aLen);cin >> bLen;init(B, bLen);reverseList(A);reverseList(B);add(A, B);reverseList(A);show(A);return 0;
}